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