GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: test/simple.cpp Lines: 203 203 100.0 %
Date: 2024-02-09 12:57:42 Branches: 980 1960 50.0 %

Line Branch Exec Source
1
#define BOOST_TEST_MODULE FCL_SIMPLE
2
#include <boost/test/included/unit_test.hpp>
3
4
#include <hpp/fcl/internal/intersect.h>
5
#include <hpp/fcl/collision.h>
6
#include <hpp/fcl/BVH/BVH_model.h>
7
#include "fcl_resources/config.h"
8
#include <sstream>
9
10
using namespace hpp::fcl;
11
12
static FCL_REAL epsilon = 1e-6;
13
14
112
static bool approx(FCL_REAL x, FCL_REAL y) { return std::abs(x - y) < epsilon; }
15
16
















4
BOOST_AUTO_TEST_CASE(projection_test_line) {
17
2
  Vec3f v1(0, 0, 0);
18
2
  Vec3f v2(2, 0, 0);
19
20
2
  Vec3f p(1, 0, 0);
21
2
  Project::ProjectResult res = Project::projectLine(v1, v2, p);
22



2
  BOOST_CHECK(res.encode == 3);
23



2
  BOOST_CHECK(approx(res.sqr_distance, 0));
24



2
  BOOST_CHECK(approx(res.parameterization[0], 0.5));
25



2
  BOOST_CHECK(approx(res.parameterization[1], 0.5));
26
27
2
  p = Vec3f(-1, 0, 0);
28
2
  res = Project::projectLine(v1, v2, p);
29



2
  BOOST_CHECK(res.encode == 1);
30



2
  BOOST_CHECK(approx(res.sqr_distance, 1));
31



2
  BOOST_CHECK(approx(res.parameterization[0], 1));
32



2
  BOOST_CHECK(approx(res.parameterization[1], 0));
33
34
2
  p = Vec3f(3, 0, 0);
35
2
  res = Project::projectLine(v1, v2, p);
36



2
  BOOST_CHECK(res.encode == 2);
37



2
  BOOST_CHECK(approx(res.sqr_distance, 1));
38



2
  BOOST_CHECK(approx(res.parameterization[0], 0));
39



2
  BOOST_CHECK(approx(res.parameterization[1], 1));
40
2
}
41
42
















4
BOOST_AUTO_TEST_CASE(projection_test_triangle) {
43
2
  Vec3f v1(0, 0, 1);
44
2
  Vec3f v2(0, 1, 0);
45
2
  Vec3f v3(1, 0, 0);
46
47
2
  Vec3f p(1, 1, 1);
48
2
  Project::ProjectResult res = Project::projectTriangle(v1, v2, v3, p);
49



2
  BOOST_CHECK(res.encode == 7);
50



2
  BOOST_CHECK(approx(res.sqr_distance, 4 / 3.0));
51



2
  BOOST_CHECK(approx(res.parameterization[0], 1 / 3.0));
52



2
  BOOST_CHECK(approx(res.parameterization[1], 1 / 3.0));
53



2
  BOOST_CHECK(approx(res.parameterization[2], 1 / 3.0));
54
55
2
  p = Vec3f(0, 0, 1.5);
56
2
  res = Project::projectTriangle(v1, v2, v3, p);
57



2
  BOOST_CHECK(res.encode == 1);
58



2
  BOOST_CHECK(approx(res.sqr_distance, 0.25));
59



2
  BOOST_CHECK(approx(res.parameterization[0], 1));
60



2
  BOOST_CHECK(approx(res.parameterization[1], 0));
61



2
  BOOST_CHECK(approx(res.parameterization[2], 0));
62
63
2
  p = Vec3f(1.5, 0, 0);
64
2
  res = Project::projectTriangle(v1, v2, v3, p);
65



2
  BOOST_CHECK(res.encode == 4);
66



2
  BOOST_CHECK(approx(res.sqr_distance, 0.25));
67



2
  BOOST_CHECK(approx(res.parameterization[0], 0));
68



2
  BOOST_CHECK(approx(res.parameterization[1], 0));
69



2
  BOOST_CHECK(approx(res.parameterization[2], 1));
70
71
2
  p = Vec3f(0, 1.5, 0);
72
2
  res = Project::projectTriangle(v1, v2, v3, p);
73



2
  BOOST_CHECK(res.encode == 2);
74



2
  BOOST_CHECK(approx(res.sqr_distance, 0.25));
75



2
  BOOST_CHECK(approx(res.parameterization[0], 0));
76



2
  BOOST_CHECK(approx(res.parameterization[1], 1));
77



2
  BOOST_CHECK(approx(res.parameterization[2], 0));
78
79
2
  p = Vec3f(1, 1, 0);
80
2
  res = Project::projectTriangle(v1, v2, v3, p);
81



2
  BOOST_CHECK(res.encode == 6);
82



2
  BOOST_CHECK(approx(res.sqr_distance, 0.5));
83



2
  BOOST_CHECK(approx(res.parameterization[0], 0));
84



2
  BOOST_CHECK(approx(res.parameterization[1], 0.5));
85



2
  BOOST_CHECK(approx(res.parameterization[2], 0.5));
86
87
2
  p = Vec3f(1, 0, 1);
88
2
  res = Project::projectTriangle(v1, v2, v3, p);
89



2
  BOOST_CHECK(res.encode == 5);
90



2
  BOOST_CHECK(approx(res.sqr_distance, 0.5));
91



2
  BOOST_CHECK(approx(res.parameterization[0], 0.5));
92



2
  BOOST_CHECK(approx(res.parameterization[1], 0));
93



2
  BOOST_CHECK(approx(res.parameterization[2], 0.5));
94
95
2
  p = Vec3f(0, 1, 1);
96
2
  res = Project::projectTriangle(v1, v2, v3, p);
97



2
  BOOST_CHECK(res.encode == 3);
98



2
  BOOST_CHECK(approx(res.sqr_distance, 0.5));
99



2
  BOOST_CHECK(approx(res.parameterization[0], 0.5));
100



2
  BOOST_CHECK(approx(res.parameterization[1], 0.5));
101



2
  BOOST_CHECK(approx(res.parameterization[2], 0));
102
2
}
103
104
















4
BOOST_AUTO_TEST_CASE(projection_test_tetrahedron) {
105
2
  Vec3f v1(0, 0, 1);
106
2
  Vec3f v2(0, 1, 0);
107
2
  Vec3f v3(1, 0, 0);
108
2
  Vec3f v4(1, 1, 1);
109
110
2
  Vec3f p(0.5, 0.5, 0.5);
111
2
  Project::ProjectResult res = Project::projectTetrahedra(v1, v2, v3, v4, p);
112



2
  BOOST_CHECK(res.encode == 15);
113



2
  BOOST_CHECK(approx(res.sqr_distance, 0));
114



2
  BOOST_CHECK(approx(res.parameterization[0], 0.25));
115



2
  BOOST_CHECK(approx(res.parameterization[1], 0.25));
116



2
  BOOST_CHECK(approx(res.parameterization[2], 0.25));
117



2
  BOOST_CHECK(approx(res.parameterization[3], 0.25));
118
119
2
  p = Vec3f(0, 0, 0);
120
2
  res = Project::projectTetrahedra(v1, v2, v3, v4, p);
121



2
  BOOST_CHECK(res.encode == 7);
122



2
  BOOST_CHECK(approx(res.sqr_distance, 1 / 3.0));
123



2
  BOOST_CHECK(approx(res.parameterization[0], 1 / 3.0));
124



2
  BOOST_CHECK(approx(res.parameterization[1], 1 / 3.0));
125



2
  BOOST_CHECK(approx(res.parameterization[2], 1 / 3.0));
126



2
  BOOST_CHECK(approx(res.parameterization[3], 0));
127
128
2
  p = Vec3f(0, 1, 1);
129
2
  res = Project::projectTetrahedra(v1, v2, v3, v4, p);
130



2
  BOOST_CHECK(res.encode == 11);
131



2
  BOOST_CHECK(approx(res.sqr_distance, 1 / 3.0));
132



2
  BOOST_CHECK(approx(res.parameterization[0], 1 / 3.0));
133



2
  BOOST_CHECK(approx(res.parameterization[1], 1 / 3.0));
134



2
  BOOST_CHECK(approx(res.parameterization[2], 0));
135



2
  BOOST_CHECK(approx(res.parameterization[3], 1 / 3.0));
136
137
2
  p = Vec3f(1, 1, 0);
138
2
  res = Project::projectTetrahedra(v1, v2, v3, v4, p);
139



2
  BOOST_CHECK(res.encode == 14);
140



2
  BOOST_CHECK(approx(res.sqr_distance, 1 / 3.0));
141



2
  BOOST_CHECK(approx(res.parameterization[0], 0));
142



2
  BOOST_CHECK(approx(res.parameterization[1], 1 / 3.0));
143



2
  BOOST_CHECK(approx(res.parameterization[2], 1 / 3.0));
144



2
  BOOST_CHECK(approx(res.parameterization[3], 1 / 3.0));
145
146
2
  p = Vec3f(1, 0, 1);
147
2
  res = Project::projectTetrahedra(v1, v2, v3, v4, p);
148



2
  BOOST_CHECK(res.encode == 13);
149



2
  BOOST_CHECK(approx(res.sqr_distance, 1 / 3.0));
150



2
  BOOST_CHECK(approx(res.parameterization[0], 1 / 3.0));
151



2
  BOOST_CHECK(approx(res.parameterization[1], 0));
152



2
  BOOST_CHECK(approx(res.parameterization[2], 1 / 3.0));
153



2
  BOOST_CHECK(approx(res.parameterization[3], 1 / 3.0));
154
155
2
  p = Vec3f(1.5, 1.5, 1.5);
156
2
  res = Project::projectTetrahedra(v1, v2, v3, v4, p);
157



2
  BOOST_CHECK(res.encode == 8);
158



2
  BOOST_CHECK(approx(res.sqr_distance, 0.75));
159



2
  BOOST_CHECK(approx(res.parameterization[0], 0));
160



2
  BOOST_CHECK(approx(res.parameterization[1], 0));
161



2
  BOOST_CHECK(approx(res.parameterization[2], 0));
162



2
  BOOST_CHECK(approx(res.parameterization[3], 1));
163
164
2
  p = Vec3f(1.5, -0.5, -0.5);
165
2
  res = Project::projectTetrahedra(v1, v2, v3, v4, p);
166



2
  BOOST_CHECK(res.encode == 4);
167



2
  BOOST_CHECK(approx(res.sqr_distance, 0.75));
168



2
  BOOST_CHECK(approx(res.parameterization[0], 0));
169



2
  BOOST_CHECK(approx(res.parameterization[1], 0));
170



2
  BOOST_CHECK(approx(res.parameterization[2], 1));
171



2
  BOOST_CHECK(approx(res.parameterization[3], 0));
172
173
2
  p = Vec3f(-0.5, -0.5, 1.5);
174
2
  res = Project::projectTetrahedra(v1, v2, v3, v4, p);
175



2
  BOOST_CHECK(res.encode == 1);
176



2
  BOOST_CHECK(approx(res.sqr_distance, 0.75));
177



2
  BOOST_CHECK(approx(res.parameterization[0], 1));
178



2
  BOOST_CHECK(approx(res.parameterization[1], 0));
179



2
  BOOST_CHECK(approx(res.parameterization[2], 0));
180



2
  BOOST_CHECK(approx(res.parameterization[3], 0));
181
182
2
  p = Vec3f(-0.5, 1.5, -0.5);
183
2
  res = Project::projectTetrahedra(v1, v2, v3, v4, p);
184



2
  BOOST_CHECK(res.encode == 2);
185



2
  BOOST_CHECK(approx(res.sqr_distance, 0.75));
186



2
  BOOST_CHECK(approx(res.parameterization[0], 0));
187



2
  BOOST_CHECK(approx(res.parameterization[1], 1));
188



2
  BOOST_CHECK(approx(res.parameterization[2], 0));
189



2
  BOOST_CHECK(approx(res.parameterization[3], 0));
190
191
2
  p = Vec3f(0.5, -0.5, 0.5);
192
2
  res = Project::projectTetrahedra(v1, v2, v3, v4, p);
193



2
  BOOST_CHECK(res.encode == 5);
194



2
  BOOST_CHECK(approx(res.sqr_distance, 0.25));
195



2
  BOOST_CHECK(approx(res.parameterization[0], 0.5));
196



2
  BOOST_CHECK(approx(res.parameterization[1], 0));
197



2
  BOOST_CHECK(approx(res.parameterization[2], 0.5));
198



2
  BOOST_CHECK(approx(res.parameterization[3], 0));
199
200
2
  p = Vec3f(0.5, 1.5, 0.5);
201
2
  res = Project::projectTetrahedra(v1, v2, v3, v4, p);
202



2
  BOOST_CHECK(res.encode == 10);
203



2
  BOOST_CHECK(approx(res.sqr_distance, 0.25));
204



2
  BOOST_CHECK(approx(res.parameterization[0], 0));
205



2
  BOOST_CHECK(approx(res.parameterization[1], 0.5));
206



2
  BOOST_CHECK(approx(res.parameterization[2], 0));
207



2
  BOOST_CHECK(approx(res.parameterization[3], 0.5));
208
209
2
  p = Vec3f(1.5, 0.5, 0.5);
210
2
  res = Project::projectTetrahedra(v1, v2, v3, v4, p);
211



2
  BOOST_CHECK(res.encode == 12);
212



2
  BOOST_CHECK(approx(res.sqr_distance, 0.25));
213



2
  BOOST_CHECK(approx(res.parameterization[0], 0));
214



2
  BOOST_CHECK(approx(res.parameterization[1], 0));
215



2
  BOOST_CHECK(approx(res.parameterization[2], 0.5));
216



2
  BOOST_CHECK(approx(res.parameterization[3], 0.5));
217
218
2
  p = Vec3f(-0.5, 0.5, 0.5);
219
2
  res = Project::projectTetrahedra(v1, v2, v3, v4, p);
220



2
  BOOST_CHECK(res.encode == 3);
221



2
  BOOST_CHECK(approx(res.sqr_distance, 0.25));
222



2
  BOOST_CHECK(approx(res.parameterization[0], 0.5));
223



2
  BOOST_CHECK(approx(res.parameterization[1], 0.5));
224



2
  BOOST_CHECK(approx(res.parameterization[2], 0));
225



2
  BOOST_CHECK(approx(res.parameterization[3], 0));
226
227
2
  p = Vec3f(0.5, 0.5, 1.5);
228
2
  res = Project::projectTetrahedra(v1, v2, v3, v4, p);
229



2
  BOOST_CHECK(res.encode == 9);
230



2
  BOOST_CHECK(approx(res.sqr_distance, 0.25));
231



2
  BOOST_CHECK(approx(res.parameterization[0], 0.5));
232



2
  BOOST_CHECK(approx(res.parameterization[1], 0));
233



2
  BOOST_CHECK(approx(res.parameterization[2], 0));
234



2
  BOOST_CHECK(approx(res.parameterization[3], 0.5));
235
236
2
  p = Vec3f(0.5, 0.5, -0.5);
237
2
  res = Project::projectTetrahedra(v1, v2, v3, v4, p);
238



2
  BOOST_CHECK(res.encode == 6);
239



2
  BOOST_CHECK(approx(res.sqr_distance, 0.25));
240



2
  BOOST_CHECK(approx(res.parameterization[0], 0));
241



2
  BOOST_CHECK(approx(res.parameterization[1], 0.5));
242



2
  BOOST_CHECK(approx(res.parameterization[2], 0.5));
243



2
  BOOST_CHECK(approx(res.parameterization[3], 0));
244
2
}