1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.geometry.io.euclidean.threed;
18
19 import java.util.Arrays;
20 import java.util.List;
21
22 import org.apache.commons.geometry.core.GeometryTestUtils;
23 import org.apache.commons.geometry.euclidean.EuclideanTestUtils;
24 import org.apache.commons.geometry.euclidean.threed.ConvexPolygon3D;
25 import org.apache.commons.geometry.euclidean.threed.Vector3D;
26 import org.apache.commons.numbers.core.Precision;
27 import org.junit.jupiter.api.Assertions;
28 import org.junit.jupiter.api.Test;
29
30 class FacetDefinitionsTest {
31
32 private static final double TEST_EPS = 1e-10;
33
34 private static final Precision.DoubleEquivalence TEST_PRECISION = Precision.doubleEquivalenceOfEpsilon(TEST_EPS);
35
36 private static final List<Vector3D> FACET_PTS = Arrays.asList(
37 Vector3D.ZERO, Vector3D.of(1, 0, 0), Vector3D.of(1, 1, 0), Vector3D.of(0, 1, 0));
38
39 @Test
40 void testToPolygon_noNormal() {
41
42 final SimpleFacetDefinition f = new SimpleFacetDefinition(FACET_PTS);
43
44
45 final ConvexPolygon3D p = FacetDefinitions.toPolygon(f, TEST_PRECISION);
46
47
48 Assertions.assertSame(TEST_PRECISION, p.getPlane().getPrecision());
49
50 EuclideanTestUtils.assertCoordinatesEqual(Vector3D.Unit.PLUS_Z, p.getPlane().getNormal(), TEST_EPS);
51 Assertions.assertEquals(4, p.getVertices().size());
52 Assertions.assertEquals(1.0, p.getSize(), TEST_EPS);
53 }
54
55 @Test
56 void testToPolygon_withNormal_similarDirection() {
57
58 final Vector3D normal = Vector3D.of(0.1, 0.2, 0.3);
59 final SimpleFacetDefinition f = new SimpleFacetDefinition(FACET_PTS, normal);
60
61
62 final ConvexPolygon3D p = FacetDefinitions.toPolygon(f, TEST_PRECISION);
63
64
65 Assertions.assertSame(TEST_PRECISION, p.getPlane().getPrecision());
66
67 EuclideanTestUtils.assertCoordinatesEqual(Vector3D.Unit.PLUS_Z, p.getPlane().getNormal(), TEST_EPS);
68 Assertions.assertEquals(4, p.getVertices().size());
69 Assertions.assertEquals(1.0, p.getSize(), TEST_EPS);
70 }
71
72 @Test
73 void testToPolygon_withNormal_differentDirection() {
74
75 final Vector3D normal = Vector3D.of(0.1, 0.2, -0.3);
76 final SimpleFacetDefinition f = new SimpleFacetDefinition(FACET_PTS, normal);
77
78
79 final ConvexPolygon3D p = FacetDefinitions.toPolygon(f, TEST_PRECISION);
80
81
82 Assertions.assertSame(TEST_PRECISION, p.getPlane().getPrecision());
83
84 EuclideanTestUtils.assertCoordinatesEqual(Vector3D.Unit.MINUS_Z, p.getPlane().getNormal(), TEST_EPS);
85 Assertions.assertEquals(4, p.getVertices().size());
86 Assertions.assertEquals(1.0, p.getSize(), TEST_EPS);
87 }
88
89 @Test
90 void testToPolygon_failure() {
91
92 final SimpleFacetDefinition f = new SimpleFacetDefinition(Arrays.asList(
93 Vector3D.ZERO, Vector3D.ZERO, Vector3D.ZERO));
94
95
96 Assertions.assertThrows(IllegalArgumentException.class, () -> FacetDefinitions.toPolygon(f, TEST_PRECISION));
97 }
98
99 @Test
100 void testToPolygon_invalidArgs() {
101
102 final SimpleFacetDefinition f = new SimpleFacetDefinition(Arrays.asList(
103 Vector3D.ZERO, Vector3D.ZERO, Vector3D.ZERO));
104
105
106 GeometryTestUtils.assertThrowsWithMessage(
107 () -> FacetDefinitions.toPolygon(null, TEST_PRECISION),
108 NullPointerException.class, "Facet cannot be null");
109
110 GeometryTestUtils.assertThrowsWithMessage(
111 () -> FacetDefinitions.toPolygon(f, null),
112 NullPointerException.class, "Precision context cannot be null");
113 }
114 }