1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.geometry.hull.euclidean.twod;
18
19 import java.util.ArrayList;
20 import java.util.Arrays;
21 import java.util.Collections;
22 import java.util.List;
23
24 import org.apache.commons.geometry.core.GeometryTestUtils;
25 import org.apache.commons.geometry.core.precision.DoublePrecisionContext;
26 import org.apache.commons.geometry.core.precision.EpsilonDoublePrecisionContext;
27 import org.apache.commons.geometry.euclidean.EuclideanTestUtils;
28 import org.apache.commons.geometry.euclidean.twod.Vector2D;
29 import org.apache.commons.geometry.euclidean.twod.path.LinePath;
30 import org.junit.Assert;
31 import org.junit.Test;
32
33 public class ConvexHull2DTest {
34
35 private static final double TEST_EPS = 1e-10;
36
37 private static final DoublePrecisionContext TEST_PRECISION =
38 new EpsilonDoublePrecisionContext(TEST_EPS);
39
40 @Test
41 public void testProperties_noPoints() {
42
43 final ConvexHull2D hull = new ConvexHull2D(Collections.emptyList(), TEST_PRECISION);
44
45
46 Assert.assertEquals(0, hull.getVertices().size());
47
48 final LinePath path = hull.getPath();
49 Assert.assertEquals(0, path.getElements().size());
50
51 final List<Vector2D> pathVertices = path.getVertexSequence();
52 Assert.assertEquals(0, pathVertices.size());
53
54 Assert.assertNull(hull.getRegion());
55 }
56
57 @Test
58 public void testProperties_singlePoint() {
59
60 final List<Vector2D> vertices = Collections.singletonList(Vector2D.Unit.PLUS_X);
61
62
63 final ConvexHull2D hull = new ConvexHull2D(vertices, TEST_PRECISION);
64
65
66 Assert.assertEquals(vertices, hull.getVertices());
67
68 final LinePath path = hull.getPath();
69 Assert.assertEquals(0, path.getElements().size());
70
71 final List<Vector2D> pathVertices = path.getVertexSequence();
72 Assert.assertEquals(0, pathVertices.size());
73
74 Assert.assertNull(hull.getRegion());
75 }
76
77 @Test
78 public void testProperties_twoPoints() {
79
80 final List<Vector2D> vertices = Arrays.asList(Vector2D.Unit.PLUS_X, Vector2D.Unit.PLUS_Y);
81
82
83 final ConvexHull2D hull = new ConvexHull2D(vertices, TEST_PRECISION);
84
85
86 Assert.assertEquals(vertices, hull.getVertices());
87
88 final LinePath path = hull.getPath();
89 Assert.assertEquals(1, path.getElements().size());
90
91 final List<Vector2D> pathVertices = path.getVertexSequence();
92 Assert.assertEquals(2, pathVertices.size());
93 EuclideanTestUtils.assertCoordinatesEqual(Vector2D.Unit.PLUS_X, pathVertices.get(0), TEST_EPS);
94 EuclideanTestUtils.assertCoordinatesEqual(Vector2D.Unit.PLUS_Y, pathVertices.get(1), TEST_EPS);
95
96 Assert.assertNull(hull.getRegion());
97 }
98
99 @Test
100 public void testProperties_threePoints() {
101
102 final List<Vector2D> vertices = Arrays.asList(Vector2D.ZERO, Vector2D.Unit.PLUS_X, Vector2D.Unit.PLUS_Y);
103
104
105 final ConvexHull2D hull = new ConvexHull2D(vertices, TEST_PRECISION);
106
107
108 Assert.assertEquals(vertices, hull.getVertices());
109
110 final LinePath path = hull.getPath();
111 Assert.assertEquals(3, path.getElements().size());
112
113 final List<Vector2D> pathVertices = path.getVertexSequence();
114 Assert.assertEquals(4, pathVertices.size());
115 EuclideanTestUtils.assertCoordinatesEqual(Vector2D.ZERO, pathVertices.get(0), TEST_EPS);
116 EuclideanTestUtils.assertCoordinatesEqual(Vector2D.Unit.PLUS_X, pathVertices.get(1), TEST_EPS);
117 EuclideanTestUtils.assertCoordinatesEqual(Vector2D.Unit.PLUS_Y, pathVertices.get(2), TEST_EPS);
118 EuclideanTestUtils.assertCoordinatesEqual(Vector2D.ZERO, pathVertices.get(3), TEST_EPS);
119
120 Assert.assertEquals(0.5, hull.getRegion().getSize(), TEST_EPS);
121 }
122
123 @Test
124 public void testProperties_fourPoints() {
125
126 final List<Vector2D> vertices = Arrays.asList(Vector2D.ZERO, Vector2D.Unit.PLUS_X,
127 Vector2D.of(1, 1), Vector2D.Unit.PLUS_Y);
128
129
130 final ConvexHull2D hull = new ConvexHull2D(vertices, TEST_PRECISION);
131
132
133 Assert.assertEquals(vertices, hull.getVertices());
134
135 final LinePath path = hull.getPath();
136 Assert.assertEquals(4, path.getElements().size());
137
138 final List<Vector2D> pathVertices = path.getVertexSequence();
139 Assert.assertEquals(5, pathVertices.size());
140 EuclideanTestUtils.assertCoordinatesEqual(Vector2D.ZERO, pathVertices.get(0), TEST_EPS);
141 EuclideanTestUtils.assertCoordinatesEqual(Vector2D.Unit.PLUS_X, pathVertices.get(1), TEST_EPS);
142 EuclideanTestUtils.assertCoordinatesEqual(Vector2D.of(1, 1), pathVertices.get(2), TEST_EPS);
143 EuclideanTestUtils.assertCoordinatesEqual(Vector2D.Unit.PLUS_Y, pathVertices.get(3), TEST_EPS);
144 EuclideanTestUtils.assertCoordinatesEqual(Vector2D.ZERO, pathVertices.get(4), TEST_EPS);
145
146 Assert.assertEquals(1.0, hull.getRegion().getSize(), TEST_EPS);
147 }
148
149 @Test
150 public void testVertexListCannotBeModified() {
151
152 final List<Vector2D> vertices = new ArrayList<>();
153 vertices.add(Vector2D.Unit.PLUS_X);
154
155 final ConvexHull2D hull = new ConvexHull2D(vertices, TEST_PRECISION);
156
157
158 final List<Vector2D> hullVertices = hull.getVertices();
159
160
161 Assert.assertNotSame(vertices, hullVertices);
162 GeometryTestUtils.assertThrows(() -> {
163 hullVertices.add(Vector2D.Unit.PLUS_Y);
164 }, UnsupportedOperationException.class);
165 }
166
167 @Test
168 public void testToString() {
169
170 final List<Vector2D> vertices = Collections.singletonList(Vector2D.Unit.PLUS_X);
171 final ConvexHull2D hull = new ConvexHull2D(vertices, TEST_PRECISION);
172
173
174 final String str = hull.toString();
175
176
177 GeometryTestUtils.assertContains("ConvexHull2D[vertices= [(1", str);
178 }
179 }