1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 package ffx.numerics.quickhull;
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 import ffx.utilities.FFXTest;
70 import org.junit.Assert;
71 import org.junit.Test;
72
73 public class ConvexHullTest extends FFXTest {
74
75 @Test
76 public void testConvexHull() throws Exception {
77 Point3d[] points = new Point3d[]{
78 new Point3d(0.3215426810286406, 0.1678336189760208, -0.2203710966001927),
79 new Point3d(0.2229772524190855, -0.4213242506806965, -0.1966818060695024),
80 new Point3d(0.3688830163971363, -0.1831502133823468, -0.2056387967482571),
81 new Point3d(-0.1712592515826777, -0.3542439228428937, 0.2223876390814666),
82 new Point3d(-0.3309556113844324, -0.370961861099081, 0.2439994981922204),
83 new Point3d(-0.1004397059794885, -0.09014152417903909, -0.008600084584765189),
84 new Point3d(0.458374538420117, -0.09914027349943322, -0.2505798421339875),
85 new Point3d(-0.4954086979808367, -0.3339869997780649, -0.3195065691317492),
86 new Point3d(0.053091190339151, 0.3036317017894533, 0.1380056861210668),
87 new Point3d(0.4615616439483703, 0.4665423151725366, 0.1766835406205464),
88 new Point3d(-0.4797380864431505, 0.0419809916447671, -0.4254776681079321),
89 new Point3d(-0.003168473023146823, -0.2525299883005488, -0.27151530400991),
90 new Point3d(-0.3577162826971303, -0.1375644040643837, -0.04494194644032229),
91 new Point3d(-0.3392973838740004, 0.4288679723896719, -0.01599531622230571),
92 new Point3d(0.1667164640191164, 0.003605551555385444, -0.4014989499947977),
93 new Point3d(0.00714666676441833, 0.1140243407469469, 0.407090128778564),
94 new Point3d(-0.03621271768232132, 0.3728502838619522, 0.4947140370446388),
95 new Point3d(-0.3411871756810576, -0.3328629143842151, -0.4270033635450559),
96 new Point3d(0.3544683273457627, -0.450828987127942, -0.0827870439577727),
97 new Point3d(-0.4018510635028137, 0.08917494033386464, -0.2367824197158054),
98 new Point3d(0.3978697768392692, -0.002667689232777493, 0.1641431727112673),
99 new Point3d(-0.245701439441835, 0.495905311308713, -0.3194406286994373),
100 new Point3d(0.161352035739787, -0.1563404972258401, 0.3852604361113724),
101 new Point3d(0.07214279572678994, -0.4960366976410492, 0.1112227161519441),
102 new Point3d(0.3201855824516951, 0.359077846965825, 0.02136723140381946),
103 new Point3d(0.1190541238701475, -0.05734495917087884, 0.2032677509852384),
104 new Point3d(0.3210853052521919, 0.4807189479290684, 0.4433501688235907),
105 new Point3d(0.3862800354941562, 0.2085496142586224, 0.09336129957191763),
106 new Point3d(0.1233572616459404, 0.265491605052251, 0.117400122450106),
107 new Point3d(0.1438531872293476, -0.2594872752758556, -0.2026374435076839),
108 new Point3d(0.2724846394476338, -0.3506708492996831, 0.2750346518820475),
109 new Point3d(-0.4926118841325975, -0.3279366743079728, 0.3683135596740186),
110 new Point3d(0.2459906458351674, 0.3647787136629026, -0.1641662355178652),
111 new Point3d(-0.141922976953837, -0.2994764654892278, -0.3009570467294725),
112 new Point3d(-0.1850859398814719, 0.2606059478228967, 0.004159106876849283),
113 new Point3d(-0.09789466634196664, -0.3156603563722785, -0.303610991503681),
114 new Point3d(0.2100642609503719, -0.4499717643018549, 0.3245569875692548),
115 new Point3d(-0.1707163766685095, -0.2301452446078371, -0.05112823569320907),
116 new Point3d(-0.312260808713977, -0.1674135249735914, 0.2808831662692904),
117 new Point3d(-0.1966306233747216, 0.2291105671125563, -0.3387042454804333)
118 };
119 Point3d[] expected = {
120 new Point3d(0.3215426810286406, 0.1678336189760208, -0.2203710966001927),
121 new Point3d(0.2229772524190855, -0.4213242506806965, -0.1966818060695024),
122 new Point3d(0.458374538420117, -0.09914027349943322, -0.2505798421339875),
123 new Point3d(-0.4954086979808367, -0.3339869997780649, -0.3195065691317492),
124 new Point3d(0.4615616439483703, 0.4665423151725366, 0.1766835406205464),
125 new Point3d(-0.4797380864431505, 0.0419809916447671, -0.4254776681079321),
126 new Point3d(-0.3392973838740004, 0.4288679723896719, -0.01599531622230571),
127 new Point3d(0.1667164640191164, 0.003605551555385444, -0.4014989499947977),
128 new Point3d(-0.03621271768232132, 0.3728502838619522, 0.4947140370446388),
129 new Point3d(-0.3411871756810576, -0.3328629143842151, -0.4270033635450559),
130 new Point3d(0.3544683273457627, -0.450828987127942, -0.0827870439577727),
131 new Point3d(0.3978697768392692, -0.002667689232777493, 0.1641431727112673),
132 new Point3d(-0.245701439441835, 0.495905311308713, -0.3194406286994373),
133 new Point3d(0.161352035739787, -0.1563404972258401, 0.3852604361113724),
134 new Point3d(0.07214279572678994, -0.4960366976410492, 0.1112227161519441),
135 new Point3d(0.3210853052521919, 0.4807189479290684, 0.4433501688235907),
136 new Point3d(0.2724846394476338, -0.3506708492996831, 0.2750346518820475),
137 new Point3d(-0.4926118841325975, -0.3279366743079728, 0.3683135596740186),
138 new Point3d(0.2459906458351674, 0.3647787136629026, -0.1641662355178652),
139 new Point3d(0.2100642609503719, -0.4499717643018549, 0.3245569875692548)
140 };
141
142 QuickHull3D covexHull = new QuickHull3D();
143 covexHull.build(points);
144
145 logger.info("Vertices:");
146
147 Point3d[] vertices = covexHull.getVertices();
148
149 Assert.assertEquals(expected.length, vertices.length);
150 for (int i = 0; i < vertices.length; i++) {
151 Point3d pnt = vertices[i];
152 logger.info(pnt.x + " " + pnt.y + " " + pnt.z);
153 boolean found = false;
154 for (Point3d point3d : expected) {
155 double diff = Math.abs(pnt.x - point3d.x) + Math.abs(pnt.y - point3d.y) + Math.abs(pnt.y - point3d.y);
156 if (diff < 0.0000001) {
157 found = true;
158 }
159 }
160 Assert.assertTrue(found);
161 }
162
163 }
164 }