1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.geometry.euclidean.threed;
18
19 import java.util.ArrayList;
20 import java.util.Arrays;
21 import java.util.List;
22 import java.util.stream.Collectors;
23
24 import org.apache.commons.numbers.core.Precision;
25 import org.junit.jupiter.api.Assertions;
26 import org.junit.jupiter.api.Test;
27
28 class BoundarySource3DTest {
29
30 private static final double TEST_EPS = 1e-10;
31
32 private static final Precision.DoubleEquivalence TEST_PRECISION =
33 Precision.doubleEquivalenceOfEpsilon(TEST_EPS);
34
35 @Test
36 void testToList() {
37
38 final BoundarySource3D src = BoundarySource3D.of(
39 Planes.convexPolygonFromVertices(
40 Arrays.asList(Vector3D.ZERO, Vector3D.Unit.PLUS_X, Vector3D.Unit.PLUS_Y), TEST_PRECISION)
41 );
42
43
44 final BoundaryList3D list = src.toList();
45
46
47 Assertions.assertEquals(1, list.count());
48 }
49
50 @Test
51 void testToList_noBoundaries() {
52
53 final BoundarySource3D src = BoundarySource3D.of();
54
55
56 final BoundaryList3D list = src.toList();
57
58
59 Assertions.assertEquals(0, list.count());
60 }
61
62 @Test
63 void testToTree() {
64
65 final PlaneConvexSubset a = Planes.convexPolygonFromVertices(
66 Arrays.asList(Vector3D.ZERO, Vector3D.Unit.PLUS_X, Vector3D.Unit.PLUS_Y), TEST_PRECISION);
67 final PlaneConvexSubset b = Planes.convexPolygonFromVertices(
68 Arrays.asList(Vector3D.ZERO, Vector3D.Unit.PLUS_Y, Vector3D.Unit.MINUS_Z), TEST_PRECISION);
69
70 final BoundarySource3D src = BoundarySource3D.of(a, b);
71
72
73 final RegionBSPTree3D tree = src.toTree();
74
75
76 Assertions.assertEquals(5, tree.count());
77 Assertions.assertFalse(tree.isFull());
78 Assertions.assertFalse(tree.isEmpty());
79 }
80
81 @Test
82 void testToTree_noBoundaries() {
83
84 final BoundarySource3D src = BoundarySource3D.of();
85
86
87 final RegionBSPTree3D tree = src.toTree();
88
89
90 Assertions.assertEquals(1, tree.count());
91 Assertions.assertFalse(tree.isFull());
92 Assertions.assertTrue(tree.isEmpty());
93 }
94
95 @Test
96 void testOf_varargs_empty() {
97
98 final BoundarySource3D src = BoundarySource3D.of();
99
100
101 final List<PlaneConvexSubset> segments = src.boundaryStream().collect(Collectors.toList());
102 Assertions.assertEquals(0, segments.size());
103 }
104
105 @Test
106 void testOf_varargs() {
107
108 final PlaneConvexSubset a = Planes.convexPolygonFromVertices(
109 Arrays.asList(Vector3D.ZERO, Vector3D.Unit.PLUS_X, Vector3D.Unit.PLUS_Y), TEST_PRECISION);
110 final PlaneConvexSubset b = Planes.convexPolygonFromVertices(
111 Arrays.asList(Vector3D.ZERO, Vector3D.Unit.PLUS_Y, Vector3D.Unit.MINUS_Z), TEST_PRECISION);
112
113 final BoundarySource3D src = BoundarySource3D.of(a, b);
114
115
116 final List<PlaneConvexSubset> boundaries = src.boundaryStream().collect(Collectors.toList());
117 Assertions.assertEquals(2, boundaries.size());
118
119 Assertions.assertSame(a, boundaries.get(0));
120 Assertions.assertSame(b, boundaries.get(1));
121 }
122
123 @Test
124 void testOf_list_empty() {
125
126 final List<PlaneConvexSubset> input = new ArrayList<>();
127
128
129 final BoundarySource3D src = BoundarySource3D.of(input);
130
131
132 final List<PlaneConvexSubset> segments = src.boundaryStream().collect(Collectors.toList());
133 Assertions.assertEquals(0, segments.size());
134 }
135
136 @Test
137 void testOf_list() {
138
139 final PlaneConvexSubset a = Planes.convexPolygonFromVertices(
140 Arrays.asList(Vector3D.ZERO, Vector3D.Unit.PLUS_X, Vector3D.Unit.PLUS_Y), TEST_PRECISION);
141 final PlaneConvexSubset b = Planes.convexPolygonFromVertices(
142 Arrays.asList(Vector3D.ZERO, Vector3D.Unit.PLUS_Y, Vector3D.Unit.MINUS_Z), TEST_PRECISION);
143
144 final List<PlaneConvexSubset> input = new ArrayList<>();
145 input.add(a);
146 input.add(b);
147
148 final BoundarySource3D src = BoundarySource3D.of(input);
149
150
151 final List<PlaneConvexSubset> segments = src.boundaryStream().collect(Collectors.toList());
152 Assertions.assertEquals(2, segments.size());
153
154 Assertions.assertSame(a, segments.get(0));
155 Assertions.assertSame(b, segments.get(1));
156 }
157 }