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.euclidean.threed;
23
24 import org.hipparchus.exception.MathIllegalArgumentException;
25 import org.hipparchus.geometry.euclidean.oned.Euclidean1D;
26 import org.hipparchus.geometry.euclidean.oned.IntervalsSet;
27 import org.hipparchus.geometry.euclidean.oned.OrientedPoint;
28 import org.hipparchus.geometry.euclidean.oned.SubOrientedPoint;
29 import org.hipparchus.geometry.euclidean.oned.Vector1D;
30 import org.hipparchus.geometry.partitioning.RegionFactory;
31 import org.junit.jupiter.api.Test;
32
33 import java.util.List;
34
35 import static org.junit.jupiter.api.Assertions.assertEquals;
36 import static org.junit.jupiter.api.Assertions.assertNull;
37 import static org.junit.jupiter.api.Assertions.assertTrue;
38
39 class SubLineTest {
40
41 @Test
42 void testEndPoints() throws MathIllegalArgumentException {
43 Vector3D p1 = new Vector3D(-1, -7, 2);
44 Vector3D p2 = new Vector3D(7, -1, 0);
45 Segment segment = new Segment(p1, p2, new Line(p1, p2, 1.0e-10));
46 SubLine sub = new SubLine(segment);
47 List<Segment> segments = sub.getSegments();
48 assertEquals(1, segments.size());
49 assertEquals(0.0, new Vector3D(-1, -7, 2).distance(segments.get(0).getStart()), 1.0e-10);
50 assertEquals(0.0, new Vector3D( 7, -1, 0).distance(segments.get(0).getEnd()), 1.0e-10);
51 }
52
53 @Test
54 void testNoEndPoints() throws MathIllegalArgumentException {
55 SubLine wholeLine = new Line(new Vector3D(-1, 7, 2), new Vector3D(7, 1, 0), 1.0e-10).wholeLine();
56 List<Segment> segments = wholeLine.getSegments();
57 assertEquals(1, segments.size());
58 assertTrue(Double.isInfinite(segments.get(0).getStart().getX()) &&
59 segments.get(0).getStart().getX() < 0);
60 assertTrue(Double.isInfinite(segments.get(0).getStart().getY()) &&
61 segments.get(0).getStart().getY() > 0);
62 assertTrue(Double.isInfinite(segments.get(0).getStart().getZ()) &&
63 segments.get(0).getStart().getZ() > 0);
64 assertTrue(Double.isInfinite(segments.get(0).getEnd().getX()) &&
65 segments.get(0).getEnd().getX() > 0);
66 assertTrue(Double.isInfinite(segments.get(0).getEnd().getY()) &&
67 segments.get(0).getEnd().getY() < 0);
68 assertTrue(Double.isInfinite(segments.get(0).getEnd().getZ()) &&
69 segments.get(0).getEnd().getZ() < 0);
70 }
71
72 @Test
73 void testNoSegments() throws MathIllegalArgumentException {
74 SubLine empty = new SubLine(new Line(new Vector3D(-1, -7, 2), new Vector3D(7, -1, 0), 1.0e-10),
75 (IntervalsSet) new RegionFactory<Euclidean1D, Vector1D, OrientedPoint, SubOrientedPoint>().
76 getComplement(new IntervalsSet(1.0e-10)));
77 List<Segment> segments = empty.getSegments();
78 assertEquals(0, segments.size());
79 }
80
81 @Test
82 void testSeveralSegments() throws MathIllegalArgumentException {
83 SubLine twoSubs = new SubLine(new Line(new Vector3D(-1, -7, 2), new Vector3D(7, -1, 0), 1.0e-10),
84 (IntervalsSet) new RegionFactory<Euclidean1D, Vector1D, OrientedPoint, SubOrientedPoint>().
85 union(new IntervalsSet(1, 2, 1.0e-10), new IntervalsSet(3, 4, 1.0e-10)));
86 List<Segment> segments = twoSubs.getSegments();
87 assertEquals(2, segments.size());
88 }
89
90 @Test
91 void testHalfInfiniteNeg() throws MathIllegalArgumentException {
92 SubLine empty = new SubLine(new Line(new Vector3D(-1, -7, 2), new Vector3D(7, -1, -2), 1.0e-10),
93 new IntervalsSet(Double.NEGATIVE_INFINITY, 0.0, 1.0e-10));
94 List<Segment> segments = empty.getSegments();
95 assertEquals(1, segments.size());
96 assertTrue(Double.isInfinite(segments.get(0).getStart().getX()) &&
97 segments.get(0).getStart().getX() < 0);
98 assertTrue(Double.isInfinite(segments.get(0).getStart().getY()) &&
99 segments.get(0).getStart().getY() < 0);
100 assertTrue(Double.isInfinite(segments.get(0).getStart().getZ()) &&
101 segments.get(0).getStart().getZ() > 0);
102 assertEquals(0.0, new Vector3D(3, -4, 0).distance(segments.get(0).getEnd()), 1.0e-10);
103 }
104
105 @Test
106 void testHalfInfinitePos() throws MathIllegalArgumentException {
107 SubLine empty = new SubLine(new Line(new Vector3D(-1, -7, 2), new Vector3D(7, -1, -2), 1.0e-10),
108 new IntervalsSet(0.0, Double.POSITIVE_INFINITY, 1.0e-10));
109 List<Segment> segments = empty.getSegments();
110 assertEquals(1, segments.size());
111 assertEquals(0.0, new Vector3D(3, -4, 0).distance(segments.get(0).getStart()), 1.0e-10);
112 assertTrue(Double.isInfinite(segments.get(0).getEnd().getX()) &&
113 segments.get(0).getEnd().getX() > 0);
114 assertTrue(Double.isInfinite(segments.get(0).getEnd().getY()) &&
115 segments.get(0).getEnd().getY() > 0);
116 assertTrue(Double.isInfinite(segments.get(0).getEnd().getZ()) &&
117 segments.get(0).getEnd().getZ() < 0);
118 }
119
120 @Test
121 void testIntersectionInsideInside() throws MathIllegalArgumentException {
122 SubLine sub1 = new SubLine(new Vector3D(1, 1, 1), new Vector3D(3, 1, 1), 1.0e-10);
123 SubLine sub2 = new SubLine(new Vector3D(2, 0, 0), new Vector3D(2, 2, 2), 1.0e-10);
124 assertEquals(0.0, new Vector3D(2, 1, 1).distance(sub1.intersection(sub2, true)), 1.0e-12);
125 assertEquals(0.0, new Vector3D(2, 1, 1).distance(sub1.intersection(sub2, false)), 1.0e-12);
126 }
127
128 @Test
129 void testIntersectionInsideBoundary() throws MathIllegalArgumentException {
130 SubLine sub1 = new SubLine(new Vector3D(1, 1, 1), new Vector3D(3, 1, 1), 1.0e-10);
131 SubLine sub2 = new SubLine(new Vector3D(2, 0, 0), new Vector3D(2, 1, 1), 1.0e-10);
132 assertEquals(0.0, new Vector3D(2, 1, 1).distance(sub1.intersection(sub2, true)), 1.0e-12);
133 assertNull(sub1.intersection(sub2, false));
134 }
135
136 @Test
137 void testIntersectionInsideOutside() throws MathIllegalArgumentException {
138 SubLine sub1 = new SubLine(new Vector3D(1, 1, 1), new Vector3D(3, 1, 1), 1.0e-10);
139 SubLine sub2 = new SubLine(new Vector3D(2, 0, 0), new Vector3D(2, 0.5, 0.5), 1.0e-10);
140 assertNull(sub1.intersection(sub2, true));
141 assertNull(sub1.intersection(sub2, false));
142 }
143
144 @Test
145 void testIntersectionBoundaryBoundary() throws MathIllegalArgumentException {
146 SubLine sub1 = new SubLine(new Vector3D(1, 1, 1), new Vector3D(2, 1, 1), 1.0e-10);
147 SubLine sub2 = new SubLine(new Vector3D(2, 0, 0), new Vector3D(2, 1, 1), 1.0e-10);
148 assertEquals(0.0, new Vector3D(2, 1, 1).distance(sub1.intersection(sub2, true)), 1.0e-12);
149 assertNull(sub1.intersection(sub2, false));
150 }
151
152 @Test
153 void testIntersectionBoundaryOutside() throws MathIllegalArgumentException {
154 SubLine sub1 = new SubLine(new Vector3D(1, 1, 1), new Vector3D(2, 1, 1), 1.0e-10);
155 SubLine sub2 = new SubLine(new Vector3D(2, 0, 0), new Vector3D(2, 0.5, 0.5), 1.0e-10);
156 assertNull(sub1.intersection(sub2, true));
157 assertNull(sub1.intersection(sub2, false));
158 }
159
160 @Test
161 void testIntersectionOutsideOutside() throws MathIllegalArgumentException {
162 SubLine sub1 = new SubLine(new Vector3D(1, 1, 1), new Vector3D(1.5, 1, 1), 1.0e-10);
163 SubLine sub2 = new SubLine(new Vector3D(2, 0, 0), new Vector3D(2, 0.5, 0.5), 1.0e-10);
164 assertNull(sub1.intersection(sub2, true));
165 assertNull(sub1.intersection(sub2, false));
166 }
167
168 @Test
169 void testIntersectionNotIntersecting() throws MathIllegalArgumentException {
170 SubLine sub1 = new SubLine(new Vector3D(1, 1, 1), new Vector3D(1.5, 1, 1), 1.0e-10);
171 SubLine sub2 = new SubLine(new Vector3D(2, 3, 0), new Vector3D(2, 3, 0.5), 1.0e-10);
172 assertNull(sub1.intersection(sub2, true));
173 assertNull(sub1.intersection(sub2, false));
174 }
175
176 }