View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  /*
19   * This is not the original file distributed by the Apache Software Foundation
20   * It has been modified by the Hipparchus project
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 }