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.Rotation;
25 import org.hipparchus.geometry.euclidean.threed.Vector3D;
26 import org.hipparchus.geometry.partitioning.RegionFactory;
27 import org.hipparchus.geometry.partitioning.Side;
28 import org.hipparchus.geometry.partitioning.SubHyperplane.SplitSubHyperplane;
29 import org.hipparchus.geometry.spherical.oned.ArcsSet;
30 import org.hipparchus.geometry.spherical.oned.LimitAngle;
31 import org.hipparchus.geometry.spherical.oned.S1Point;
32 import org.hipparchus.geometry.spherical.oned.Sphere1D;
33 import org.hipparchus.geometry.spherical.oned.SubLimitAngle;
34 import org.hipparchus.util.MathUtils;
35 import org.junit.jupiter.api.Test;
36
37 import static org.junit.jupiter.api.Assertions.assertEquals;
38 import static org.junit.jupiter.api.Assertions.assertNotNull;
39 import static org.junit.jupiter.api.Assertions.assertNotSame;
40 import static org.junit.jupiter.api.Assertions.assertNull;
41 import static org.junit.jupiter.api.Assertions.assertSame;
42
43 class SubCircleTest {
44
45 @Test
46 void testFullCircle() {
47 Circle circle = new Circle(Vector3D.PLUS_K, 1.0e-10);
48 SubCircle set = circle.wholeHyperplane();
49 assertEquals(MathUtils.TWO_PI, set.getSize(), 1.0e-10);
50 assertSame(circle, set.getHyperplane());
51 assertNotSame(circle, set.copySelf().getHyperplane());
52 }
53
54 @Test
55 void testSide() {
56
57 Circle xzPlane = new Circle(Vector3D.PLUS_J, 1.0e-10);
58
59 SubCircle sc1 = create(Vector3D.PLUS_K, Vector3D.PLUS_I, Vector3D.PLUS_J, 1.0e-10, 1.0, 3.0, 5.0, 6.0);
60 assertEquals(Side.BOTH, sc1.split(xzPlane).getSide());
61
62 SubCircle sc2 = create(Vector3D.PLUS_K, Vector3D.PLUS_I, Vector3D.PLUS_J, 1.0e-10, 1.0, 3.0);
63 assertEquals(Side.MINUS, sc2.split(xzPlane).getSide());
64
65 SubCircle sc3 = create(Vector3D.PLUS_K, Vector3D.PLUS_I, Vector3D.PLUS_J, 1.0e-10, 5.0, 6.0);
66 assertEquals(Side.PLUS, sc3.split(xzPlane).getSide());
67
68 SubCircle sc4 = create(Vector3D.PLUS_J, Vector3D.PLUS_K, Vector3D.PLUS_I, 1.0e-10, 5.0, 6.0);
69 assertEquals(Side.HYPER, sc4.split(xzPlane).getSide());
70
71 SubCircle sc5 = create(Vector3D.MINUS_J, Vector3D.PLUS_I, Vector3D.PLUS_K, 1.0e-10, 5.0, 6.0);
72 assertEquals(Side.HYPER, sc5.split(xzPlane).getSide());
73
74 }
75
76 @Test
77 void testSPlit() {
78
79 Circle xzPlane = new Circle(Vector3D.PLUS_J, 1.0e-10);
80
81 SubCircle sc1 = create(Vector3D.PLUS_K, Vector3D.PLUS_I, Vector3D.PLUS_J, 1.0e-10, 1.0, 3.0, 5.0, 6.0);
82 SplitSubHyperplane<Sphere2D, S2Point, Circle, SubCircle> split1 = sc1.split(xzPlane);
83 ArcsSet plus1 = (ArcsSet) split1.getPlus().getRemainingRegion();
84 ArcsSet minus1 = (ArcsSet) split1.getMinus().getRemainingRegion();
85 assertEquals(1, plus1.asList().size());
86 assertEquals(5.0, plus1.asList().get(0).getInf(), 1.0e-10);
87 assertEquals(6.0, plus1.asList().get(0).getSup(), 1.0e-10);
88 assertEquals(1, minus1.asList().size());
89 assertEquals(1.0, minus1.asList().get(0).getInf(), 1.0e-10);
90 assertEquals(3.0, minus1.asList().get(0).getSup(), 1.0e-10);
91
92 SubCircle sc2 = create(Vector3D.PLUS_K, Vector3D.PLUS_I, Vector3D.PLUS_J, 1.0e-10, 1.0, 3.0);
93 SplitSubHyperplane<Sphere2D, S2Point, Circle, SubCircle> split2 = sc2.split(xzPlane);
94 assertNull(split2.getPlus());
95 ArcsSet minus2 = (ArcsSet) split2.getMinus().getRemainingRegion();
96 assertEquals(1, minus2.asList().size());
97 assertEquals(1.0, minus2.asList().get(0).getInf(), 1.0e-10);
98 assertEquals(3.0, minus2.asList().get(0).getSup(), 1.0e-10);
99
100 SubCircle sc3 = create(Vector3D.PLUS_K, Vector3D.PLUS_I, Vector3D.PLUS_J, 1.0e-10, 5.0, 6.0);
101 SplitSubHyperplane<Sphere2D, S2Point, Circle, SubCircle> split3 = sc3.split(xzPlane);
102 ArcsSet plus3 = (ArcsSet) split3.getPlus().getRemainingRegion();
103 assertEquals(1, plus3.asList().size());
104 assertEquals(5.0, plus3.asList().get(0).getInf(), 1.0e-10);
105 assertEquals(6.0, plus3.asList().get(0).getSup(), 1.0e-10);
106 assertNull(split3.getMinus());
107
108 SubCircle sc4 = create(Vector3D.PLUS_J, Vector3D.PLUS_K, Vector3D.PLUS_I, 1.0e-10, 5.0, 6.0);
109 SplitSubHyperplane<Sphere2D, S2Point, Circle, SubCircle> split4 = sc4.split(xzPlane);
110 assertEquals(Side.HYPER, sc4.split(xzPlane).getSide());
111 assertNull(split4.getPlus());
112 assertNull(split4.getMinus());
113
114 SubCircle sc5 = create(Vector3D.MINUS_J, Vector3D.PLUS_I, Vector3D.PLUS_K, 1.0e-10, 5.0, 6.0);
115 SplitSubHyperplane<Sphere2D, S2Point, Circle, SubCircle> split5 = sc5.split(xzPlane);
116 assertEquals(Side.HYPER, sc5.split(xzPlane).getSide());
117 assertNull(split5.getPlus());
118 assertNull(split5.getMinus());
119
120 }
121
122 @Test
123 void testSideSplitConsistency() {
124
125 double tolerance = 1.0e-6;
126 Circle hyperplane = new Circle(new Vector3D(9.738804529764676E-5, -0.6772824575010357, -0.7357230887208355),
127 tolerance);
128 SubCircle sub = new SubCircle(new Circle(new Vector3D(2.1793884139073498E-4, 0.9790647032675541, -0.20354915700704285),
129 tolerance),
130 new ArcsSet(4.7121441684170700, 4.7125386635004760, tolerance));
131 SplitSubHyperplane<Sphere2D, S2Point, Circle, SubCircle> split = sub.split(hyperplane);
132 assertNotNull(split.getMinus());
133 assertNull(split.getPlus());
134 assertEquals(Side.MINUS, sub.split(hyperplane).getSide());
135
136 }
137
138 private SubCircle create(Vector3D pole, Vector3D x, Vector3D y,
139 double tolerance, double ... limits) {
140 RegionFactory<Sphere1D, S1Point, LimitAngle, SubLimitAngle> factory = new RegionFactory<>();
141 Circle circle = new Circle(pole, tolerance);
142 Circle phased = Circle.getTransform(new Rotation(circle.getXAxis(), circle.getYAxis(), x, y)).apply(circle);
143 ArcsSet set = (ArcsSet) factory.getComplement(new ArcsSet(tolerance));
144 for (int i = 0; i < limits.length; i += 2) {
145 set = (ArcsSet) factory.union(set, new ArcsSet(limits[i], limits[i + 1], tolerance));
146 }
147 return new SubCircle(phased, set);
148 }
149
150 }