1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.hipparchus.geometry.spherical.twod;
23
24 import org.hipparchus.geometry.euclidean.threed.Vector3D;
25 import org.hipparchus.geometry.partitioning.AbstractSubHyperplane;
26 import org.hipparchus.geometry.partitioning.Region;
27 import org.hipparchus.geometry.spherical.oned.Arc;
28 import org.hipparchus.geometry.spherical.oned.ArcsSet;
29 import org.hipparchus.geometry.spherical.oned.LimitAngle;
30 import org.hipparchus.geometry.spherical.oned.S1Point;
31 import org.hipparchus.geometry.spherical.oned.Sphere1D;
32 import org.hipparchus.geometry.spherical.oned.SubLimitAngle;
33 import org.hipparchus.util.FastMath;
34
35
36
37 public class SubCircle
38 extends AbstractSubHyperplane<Sphere2D, S2Point, Circle, SubCircle, Sphere1D, S1Point, LimitAngle, SubLimitAngle> {
39
40
41
42
43
44 public SubCircle(final Circle hyperplane,
45 final Region<Sphere1D, S1Point, LimitAngle, SubLimitAngle> remainingRegion) {
46 super(hyperplane, remainingRegion);
47 }
48
49
50 @Override
51 protected SubCircle buildNew(final Circle hyperplane, final Region<Sphere1D, S1Point, LimitAngle, SubLimitAngle> remainingRegion) {
52 return new SubCircle(hyperplane, remainingRegion);
53 }
54
55
56 @Override
57 public S2Point getInteriorPoint() {
58 return isEmpty() ? null : getHyperplane().toSpace(getRemainingRegion().getInteriorPoint());
59 }
60
61
62 @Override
63 public SplitSubHyperplane<Sphere2D, S2Point, Circle, SubCircle> split(final Circle hyperplane) {
64
65 final double angle = Vector3D.angle(getHyperplane().getPole(), hyperplane.getPole());
66
67 if (angle < getHyperplane().getTolerance() || angle > FastMath.PI - getHyperplane().getTolerance()) {
68
69 return new SplitSubHyperplane<>(null, null);
70 } else {
71
72 final Arc arc = getHyperplane().getInsideArc(hyperplane);
73 final ArcsSet.Split split = ((ArcsSet) getRemainingRegion()).split(arc);
74 final ArcsSet plus = split.getPlus();
75 final ArcsSet minus = split.getMinus();
76 return new SplitSubHyperplane<>(plus == null ? null : new SubCircle(getHyperplane().copySelf(), plus),
77 minus == null ? null : new SubCircle(getHyperplane().copySelf(), minus));
78 }
79
80 }
81
82 }