Directory: | ./ |
---|---|
File: | test/gjk.cpp |
Date: | 2025-04-01 09:23:31 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 259 | 287 | 90.2% |
Branches: | 731 | 1526 | 47.9% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | * Software License Agreement (BSD License) | ||
3 | * | ||
4 | * Copyright (c) 2018, CNRS-LAAS. | ||
5 | * All rights reserved. | ||
6 | * | ||
7 | * Redistribution and use in source and binary forms, with or without | ||
8 | * modification, are permitted provided that the following conditions | ||
9 | * are met: | ||
10 | * | ||
11 | * * Redistributions of source code must retain the above copyright | ||
12 | * notice, this list of conditions and the following disclaimer. | ||
13 | * * Redistributions in binary form must reproduce the above | ||
14 | * copyright notice, this list of conditions and the following | ||
15 | * disclaimer in the documentation and/or other materials provided | ||
16 | * with the distribution. | ||
17 | * * Neither the name of Willow Garage, Inc. nor the names of its | ||
18 | * contributors may be used to endorse or promote products derived | ||
19 | * from this software without specific prior written permission. | ||
20 | * | ||
21 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
22 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
23 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
24 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
25 | * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
26 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
27 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
28 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
29 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
30 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
31 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
32 | * POSSIBILITY OF SUCH DAMAGE. | ||
33 | */ | ||
34 | |||
35 | /** \author Florent Lamiraux <florent@laas.fr> */ | ||
36 | |||
37 | #define BOOST_TEST_MODULE COAL_GJK | ||
38 | #include <time.h> | ||
39 | #include <boost/test/included/unit_test.hpp> | ||
40 | |||
41 | #include <Eigen/Geometry> | ||
42 | #include "coal/narrowphase/narrowphase.h" | ||
43 | #include "coal/shape/geometric_shapes.h" | ||
44 | #include "coal/internal/tools.h" | ||
45 | #include "coal/internal/shape_shape_func.h" | ||
46 | |||
47 | #include "utility.h" | ||
48 | |||
49 | using coal::GJKSolver; | ||
50 | using coal::GJKVariant; | ||
51 | using coal::Matrix3s; | ||
52 | using coal::Quats; | ||
53 | using coal::Scalar; | ||
54 | using coal::Transform3s; | ||
55 | using coal::TriangleP; | ||
56 | using coal::Vec3s; | ||
57 | |||
58 | typedef Eigen::Matrix<Scalar, Eigen::Dynamic, 1> vector_t; | ||
59 | typedef Eigen::Matrix<Scalar, 6, 1> vector6_t; | ||
60 | typedef Eigen::Matrix<Scalar, 4, 1> vector4_t; | ||
61 | typedef Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> matrix_t; | ||
62 | |||
63 | struct Result { | ||
64 | bool collision; | ||
65 | clock_t timeGjk; | ||
66 | clock_t timeGte; | ||
67 | }; // struct benchmark | ||
68 | |||
69 | typedef std::vector<Result> Results_t; | ||
70 | |||
71 | 2 | void test_gjk_distance_triangle_triangle( | |
72 | bool enable_gjk_nesterov_acceleration) { | ||
73 | Eigen::IOFormat numpy(Eigen::FullPrecision, Eigen::DontAlignCols, ", ", ", ", | ||
74 |
7/14✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
|
4 | "np.array ((", "))", "", ""); |
75 | Eigen::IOFormat tuple(Eigen::FullPrecision, Eigen::DontAlignCols, "", ", ", | ||
76 |
7/14✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
|
4 | "", "", "(", ")"); |
77 | 2 | std::size_t N = 10000; | |
78 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | GJKSolver solver; |
79 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
|
2 | if (enable_gjk_nesterov_acceleration) |
80 | 1 | solver.gjk.gjk_variant = GJKVariant::NesterovAcceleration; | |
81 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2 | Transform3s tf1, tf2; |
82 |
4/8✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
|
2 | Vec3s p1, p2, a1, a2; |
83 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | Matrix3s M; |
84 | 2 | Scalar distance(sqrt(-Scalar(1))); | |
85 | clock_t start, end; | ||
86 | |||
87 | 2 | std::size_t nCol = 0, nDiff = 0; | |
88 | 2 | Scalar eps = Scalar(1e-7); | |
89 |
1/2✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
|
2 | Results_t results(N); |
90 |
2/2✓ Branch 0 taken 20000 times.
✓ Branch 1 taken 2 times.
|
20002 | for (std::size_t i = 0; i < N; ++i) { |
91 |
4/8✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20000 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20000 times.
✗ Branch 11 not taken.
|
20000 | Vec3s P1_loc(Vec3s::Random()), P2_loc(Vec3s::Random()), |
92 |
2/4✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
|
20000 | P3_loc(Vec3s::Random()); |
93 |
4/8✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20000 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20000 times.
✗ Branch 11 not taken.
|
20000 | Vec3s Q1_loc(Vec3s::Random()), Q2_loc(Vec3s::Random()), |
94 |
2/4✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
|
20000 | Q3_loc(Vec3s::Random()); |
95 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 19998 times.
|
20000 | if (i == 0) { |
96 | ✗ | P1_loc = Vec3s(Scalar(0.063996093749999997), Scalar(00.15320971679687501), | |
97 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | Scalar(-0.42799999999999999)); |
98 | ✗ | P2_loc = Vec3s(Scalar(0.069105957031249998), Scalar(-0.150722900390625), | |
99 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | Scalar(-0.42999999999999999)); |
100 | ✗ | P3_loc = Vec3s(Scalar(0.063996093749999997), Scalar(-0.15320971679687501), | |
101 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | Scalar(-0.42999999999999999)); |
102 | ✗ | Q1_loc = Vec3s(Scalar(-25.655000000000001), Scalar(-1.2858199462890625), | |
103 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | Scalar(3.7249809570312502)); |
104 | ✗ | Q2_loc = Vec3s(Scalar(-10.926), Scalar(-1.284259033203125), | |
105 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | Scalar(3.7281499023437501)); |
106 | ✗ | Q3_loc = Vec3s(Scalar(-10.926), Scalar(-1.2866180419921875), | |
107 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | Scalar(3.72335400390625)); |
108 | Transform3s tf( | ||
109 | ✗ | Quats(Scalar(-0.42437287410898855), Scalar(-0.26862477561450587), | |
110 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | Scalar(-0.46249645019513175), Scalar(0.73064726592483387)), |
111 | ✗ | Vec3s(Scalar(-12.824601270753471), Scalar(-1.6840516940066426), | |
112 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
4 | Scalar(3.8914453043793844))); |
113 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | tf1 = tf; |
114 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 19996 times.
|
19998 | } else if (i == 1) { |
115 | ✗ | P1_loc = Vec3s(Scalar(-0.8027043342590332), Scalar(-0.30276307463645935), | |
116 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | Scalar(-0.4372950792312622)); |
117 | ✗ | P2_loc = Vec3s(Scalar(-0.8027043342590332), Scalar(0.30276307463645935), | |
118 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | Scalar(-0.4372950792312622)); |
119 | ✗ | P3_loc = Vec3s(Scalar(0.8027043342590332), Scalar(0.30276307463645935), | |
120 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | Scalar(-0.4372950792312622)); |
121 | ✗ | Q1_loc = Vec3s(Scalar(-0.224713996052742), Scalar(-0.7417119741439819), | |
122 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | Scalar(0.19999997317790985)); |
123 | ✗ | Q2_loc = Vec3s(Scalar(-0.5247139930725098), Scalar(-0.7417119741439819), | |
124 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | Scalar(0.19999997317790985)); |
125 | ✗ | Q3_loc = Vec3s(Scalar(-0.224713996052742), Scalar(-0.7417119741439819), | |
126 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | Scalar(0.09999997168779373)); |
127 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | Matrix3s R; |
128 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | Vec3s T; |
129 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2 | R << Scalar(0.9657787025454787), Scalar(0.09400415350535746), |
130 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2 | Scalar(0.24173273843919627), Scalar(-0.06713698817647556), |
131 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2 | Scalar(0.9908494114820345), Scalar(-0.11709000206805695), |
132 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2 | Scalar(-0.25052768814676646), Scalar(0.09685382227587608), |
133 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | Scalar(0.9632524147814993); |
134 | |||
135 |
3/6✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
|
2 | T << Scalar(-0.13491177905469953), -1, Scalar(0.6000449621843792); |
136 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | tf1.setRotation(R); |
137 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | tf1.setTranslation(T); |
138 | } else { | ||
139 |
2/4✓ Branch 1 taken 19996 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 19996 times.
✗ Branch 5 not taken.
|
19996 | tf1 = Transform3s(); |
140 | } | ||
141 | |||
142 |
1/2✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
|
20000 | TriangleP tri1(P1_loc, P2_loc, P3_loc); |
143 |
1/2✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
|
20000 | TriangleP tri2(Q1_loc, Q2_loc, Q3_loc); |
144 |
1/2✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
|
20000 | Vec3s normal; |
145 | 20000 | const bool compute_penetration = true; | |
146 |
1/2✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
|
20000 | coal::DistanceRequest request(compute_penetration, compute_penetration); |
147 |
1/2✓ Branch 2 taken 20000 times.
✗ Branch 3 not taken.
|
20000 | coal::DistanceResult result; |
148 | |||
149 | 20000 | start = clock(); | |
150 | // The specialized function TriangleP-TriangleP calls GJK to check for | ||
151 | // collision and compute the witness points but it does not use EPA to | ||
152 | // compute the penetration depth. | ||
153 |
1/2✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
|
20000 | distance = coal::ShapeShapeDistance<TriangleP, TriangleP>( |
154 | &tri1, tf1, &tri2, tf2, &solver, request, result); | ||
155 | 20000 | end = clock(); | |
156 |
1/2✓ Branch 2 taken 20000 times.
✗ Branch 3 not taken.
|
20000 | p1 = result.nearest_points[0]; |
157 |
1/2✓ Branch 2 taken 20000 times.
✗ Branch 3 not taken.
|
20000 | p2 = result.nearest_points[1]; |
158 |
1/2✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
|
20000 | normal = result.normal; |
159 | 20000 | bool res = (distance <= 0); | |
160 | 20000 | results[i].timeGjk = end - start; | |
161 | 20000 | results[i].collision = res; | |
162 |
2/2✓ Branch 0 taken 5664 times.
✓ Branch 1 taken 14336 times.
|
20000 | if (res) { |
163 |
3/6✓ Branch 1 taken 5664 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5664 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5664 times.
✗ Branch 8 not taken.
|
5664 | Vec3s c1, c2, normal2; |
164 | 5664 | ++nCol; | |
165 | // check that moving triangle 2 by the penetration depth in the | ||
166 | // direction of the normal makes the triangles collision free. | ||
167 | 5664 | Scalar penetration_depth(-distance); | |
168 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5664 times.
|
5664 | assert(penetration_depth >= 0); |
169 |
2/4✓ Branch 1 taken 5664 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5664 times.
✗ Branch 5 not taken.
|
5664 | tf2.setTranslation((penetration_depth + 10 - 4) * normal); |
170 |
1/2✓ Branch 1 taken 5664 times.
✗ Branch 2 not taken.
|
5664 | result.clear(); |
171 |
1/2✓ Branch 1 taken 5664 times.
✗ Branch 2 not taken.
|
5664 | distance = coal::ShapeShapeDistance<TriangleP, TriangleP>( |
172 | &tri1, tf1, &tri2, tf2, &solver, request, result); | ||
173 |
1/2✓ Branch 2 taken 5664 times.
✗ Branch 3 not taken.
|
5664 | c1 = result.nearest_points[0]; |
174 |
1/2✓ Branch 2 taken 5664 times.
✗ Branch 3 not taken.
|
5664 | c2 = result.nearest_points[1]; |
175 |
1/2✓ Branch 1 taken 5664 times.
✗ Branch 2 not taken.
|
5664 | normal2 = result.normal; |
176 | 5664 | res = (distance <= 0); | |
177 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5664 times.
|
5664 | if (res) { |
178 | ✗ | std::cerr << "P1 = " << P1_loc.format(tuple) << std::endl; | |
179 | ✗ | std::cerr << "P2 = " << P2_loc.format(tuple) << std::endl; | |
180 | ✗ | std::cerr << "P3 = " << P3_loc.format(tuple) << std::endl; | |
181 | ✗ | std::cerr << "Q1 = " << Q1_loc.format(tuple) << std::endl; | |
182 | ✗ | std::cerr << "Q2 = " << Q2_loc.format(tuple) << std::endl; | |
183 | ✗ | std::cerr << "Q3 = " << Q3_loc.format(tuple) << std::endl; | |
184 | ✗ | std::cerr << "p1 = " << c1.format(tuple) << std::endl; | |
185 | ✗ | std::cerr << "p2 = " << c2.format(tuple) << std::endl; | |
186 | ✗ | std::cerr << "tf1 = " << tf1.getTranslation().format(tuple) << " + " | |
187 | ✗ | << tf1.getQuatRotation().coeffs().format(tuple) << std::endl; | |
188 | ✗ | std::cerr << "tf2 = " << tf2.getTranslation().format(tuple) << " + " | |
189 | ✗ | << tf2.getQuatRotation().coeffs().format(tuple) << std::endl; | |
190 | ✗ | std::cerr << "normal = " << normal.format(tuple) << std::endl; | |
191 | ✗ | abort(); | |
192 | } | ||
193 | 5664 | distance = 0; | |
194 |
1/2✓ Branch 1 taken 5664 times.
✗ Branch 2 not taken.
|
5664 | tf2.setIdentity(); |
195 | } | ||
196 | // Compute vectors between vertices | ||
197 |
2/4✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
|
20000 | Vec3s P1(tf1.transform(P1_loc)), P2(tf1.transform(P2_loc)), |
198 |
2/4✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
|
20000 | P3(tf1.transform(P3_loc)), Q1(tf2.transform(Q1_loc)), |
199 |
2/4✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
|
20000 | Q2(tf2.transform(Q2_loc)), Q3(tf2.transform(Q3_loc)); |
200 |
2/4✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
|
20000 | Vec3s u1(P2 - P1); |
201 |
2/4✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
|
20000 | Vec3s v1(P3 - P1); |
202 |
1/2✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
|
20000 | Vec3s w1(u1.cross(v1)); |
203 |
2/4✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
|
20000 | Vec3s u2(Q2 - Q1); |
204 |
2/4✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
|
20000 | Vec3s v2(Q3 - Q1); |
205 |
1/2✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
|
20000 | Vec3s w2(u2.cross(v2)); |
206 |
7/14✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 20000 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 20000 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 20000 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 20000 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 20000 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 20000 times.
|
20000 | BOOST_CHECK(w1.squaredNorm() > eps * eps); |
207 |
2/4✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
|
20000 | M.col(0) = u1; |
208 |
2/4✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
|
20000 | M.col(1) = v1; |
209 |
2/4✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
|
20000 | M.col(2) = w1; |
210 | // Compute a1 such that p1 = P1 + a11 u1 + a12 v1 + a13 u1 x v1 | ||
211 |
4/8✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20000 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20000 times.
✗ Branch 11 not taken.
|
20000 | a1 = M.inverse() * (p1 - P1); |
212 |
28/56✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 20000 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 20000 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 20000 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 20000 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 20000 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 20000 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 20000 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 20000 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 20000 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 20000 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 20000 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 20000 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 20000 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 20000 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 20000 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 20000 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 20000 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 20000 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 20000 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 20000 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 20000 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 20000 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 20000 times.
✗ Branch 74 not taken.
✓ Branch 76 taken 20000 times.
✗ Branch 77 not taken.
✓ Branch 79 taken 20000 times.
✗ Branch 80 not taken.
✓ Branch 82 taken 20000 times.
✗ Branch 83 not taken.
✗ Branch 93 not taken.
✓ Branch 94 taken 20000 times.
|
20000 | EIGEN_VECTOR_IS_APPROX(p1, P1 + a1[0] * u1 + a1[1] * v1, eps); |
213 |
7/14✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 20000 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 20000 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 20000 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 20000 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 20000 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 20000 times.
|
20000 | BOOST_CHECK(w2.squaredNorm() > eps * eps); |
214 | // Compute a2 such that p2 = Q1 + a21 u2 + a22 v2 + a23 u2 x v2 | ||
215 |
2/4✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
|
20000 | M.col(0) = u2; |
216 |
2/4✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
|
20000 | M.col(1) = v2; |
217 |
2/4✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
|
20000 | M.col(2) = w2; |
218 |
4/8✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20000 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20000 times.
✗ Branch 11 not taken.
|
20000 | a2 = M.inverse() * (p2 - Q1); |
219 |
28/56✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 20000 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 20000 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 20000 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 20000 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 20000 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 20000 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 20000 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 20000 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 20000 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 20000 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 20000 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 20000 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 20000 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 20000 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 20000 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 20000 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 20000 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 20000 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 20000 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 20000 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 20000 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 20000 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 20000 times.
✗ Branch 74 not taken.
✓ Branch 76 taken 20000 times.
✗ Branch 77 not taken.
✓ Branch 79 taken 20000 times.
✗ Branch 80 not taken.
✓ Branch 82 taken 20000 times.
✗ Branch 83 not taken.
✗ Branch 93 not taken.
✓ Branch 94 taken 20000 times.
|
20000 | EIGEN_VECTOR_IS_APPROX(p2, Q1 + a2[0] * u2 + a2[1] * v2, eps); |
220 | |||
221 | // minimal distance and closest points can be considered as a constrained | ||
222 | // optimisation problem: | ||
223 | // | ||
224 | // min f (a1[0],a1[1], a2[0],a2[1]) | ||
225 | // g1 (a1[0],a1[1], a2[0],a2[1]) <=0 | ||
226 | // ... | ||
227 | // g6 (a1[0],a1[1], a2[0],a2[1]) <=0 | ||
228 | // with | ||
229 | // f (a1[0],a1[1], a2[0],a2[1]) = | ||
230 | // 1 2 | ||
231 | // --- dist (P1 + a1[0] u1 + a1[1] v1, Q1 + a2[0] u2 + a2[1] v2), | ||
232 | // 2 | ||
233 | // g1 (a1[0],a1[1], a2[0],a2[1]) = -a1[0] | ||
234 | // g2 (a1[0],a1[1], a2[0],a2[1]) = -a1[1] | ||
235 | // g3 (a1[0],a1[1], a2[0],a2[1]) = a1[0] + a1[1] - 1 | ||
236 | // g4 (a1[0],a1[1], a2[0],a2[1]) = -a2[0] | ||
237 | // g5 (a1[0],a1[1], a2[0],a2[1]) = -a2[1] | ||
238 | // g6 (a1[0],a1[1], a2[0],a2[1]) = a2[0] + a2[1] - 1 | ||
239 | |||
240 | // Compute gradient of f | ||
241 |
1/2✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
|
20000 | vector4_t grad_f; |
242 |
3/6✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20000 times.
✗ Branch 8 not taken.
|
20000 | grad_f[0] = -(p2 - p1).dot(u1); |
243 |
3/6✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20000 times.
✗ Branch 8 not taken.
|
20000 | grad_f[1] = -(p2 - p1).dot(v1); |
244 |
3/6✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20000 times.
✗ Branch 8 not taken.
|
20000 | grad_f[2] = (p2 - p1).dot(u2); |
245 |
3/6✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20000 times.
✗ Branch 8 not taken.
|
20000 | grad_f[3] = (p2 - p1).dot(v2); |
246 |
1/2✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
|
20000 | vector6_t g; |
247 |
2/4✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
|
20000 | g[0] = -a1[0]; |
248 |
2/4✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
|
20000 | g[1] = -a1[1]; |
249 |
3/6✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20000 times.
✗ Branch 8 not taken.
|
20000 | g[2] = a1[0] + a1[1] - 1; |
250 |
2/4✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
|
20000 | g[3] = -a2[0]; |
251 |
2/4✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
|
20000 | g[4] = -a2[1]; |
252 |
3/6✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20000 times.
✗ Branch 8 not taken.
|
20000 | g[5] = a2[0] + a2[1] - 1; |
253 |
1/2✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
|
20000 | matrix_t grad_g(4, 6); |
254 |
1/2✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
|
20000 | grad_g.setZero(); |
255 |
1/2✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
|
20000 | grad_g(0, 0) = -1.; |
256 |
1/2✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
|
20000 | grad_g(1, 1) = -1; |
257 |
1/2✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
|
20000 | grad_g(0, 2) = 1; |
258 |
1/2✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
|
20000 | grad_g(1, 2) = 1; |
259 |
1/2✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
|
20000 | grad_g(2, 3) = -1; |
260 |
1/2✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
|
20000 | grad_g(3, 4) = -1; |
261 |
1/2✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
|
20000 | grad_g(2, 5) = 1; |
262 |
1/2✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
|
20000 | grad_g(3, 5) = 1; |
263 | // Check that closest points are on triangles planes | ||
264 | // Projection of [P1p1] on line normal to triangle 1 plane is equal to 0 | ||
265 |
6/12✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 20000 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 20000 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 20000 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 20000 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 20000 times.
|
20000 | BOOST_CHECK_SMALL(a1[2], eps); |
266 | // Projection of [Q1p2] on line normal to triangle 2 plane is equal to 0 | ||
267 |
6/12✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 20000 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 20000 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 20000 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 20000 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 20000 times.
|
20000 | BOOST_CHECK_SMALL(a2[2], eps); |
268 | |||
269 | /* Check Karush–Kuhn–Tucker conditions | ||
270 | 6 | ||
271 | __ | ||
272 | \ | ||
273 | -grad f = /_ c grad g | ||
274 | i=1 i i | ||
275 | |||
276 | where c >= 0, and | ||
277 | i | ||
278 | c g = 0 for i between 1 and 6 | ||
279 | i i | ||
280 | */ | ||
281 | |||
282 |
1/2✓ Branch 1 taken 20000 times.
✗ Branch 2 not taken.
|
20000 | matrix_t Mkkt(4, 6); |
283 | 20000 | matrix_t::Index col = 0; | |
284 | // Check that constraints are satisfied | ||
285 |
2/2✓ Branch 0 taken 120000 times.
✓ Branch 1 taken 20000 times.
|
140000 | for (vector6_t::Index j = 0; j < 6; ++j) { |
286 |
7/14✓ Branch 1 taken 120000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 120000 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 120000 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 120000 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 120000 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 120000 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 120000 times.
|
120000 | BOOST_CHECK(g[j] <= eps); |
287 | // if constraint is saturated, add gradient in matrix | ||
288 |
3/4✓ Branch 1 taken 120000 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 35548 times.
✓ Branch 4 taken 84452 times.
|
120000 | if (fabs(g[j]) <= eps) { |
289 |
3/6✓ Branch 1 taken 35548 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 35548 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 35548 times.
✗ Branch 8 not taken.
|
35548 | Mkkt.col(col) = grad_g.col(j); |
290 | 35548 | ++col; | |
291 | } | ||
292 | } | ||
293 |
2/2✓ Branch 0 taken 17012 times.
✓ Branch 1 taken 2988 times.
|
20000 | if (col > 0) { |
294 |
1/2✓ Branch 1 taken 17012 times.
✗ Branch 2 not taken.
|
17012 | Mkkt.conservativeResize(4, col); |
295 | // Compute KKT coefficients ci by inverting | ||
296 | // Mkkt.c = -grad_f | ||
297 | Eigen::JacobiSVD<matrix_t> svd(Mkkt, | ||
298 |
1/2✓ Branch 1 taken 17012 times.
✗ Branch 2 not taken.
|
17012 | Eigen::ComputeThinU | Eigen::ComputeThinV); |
299 |
3/6✓ Branch 1 taken 17012 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 17012 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 17012 times.
✗ Branch 8 not taken.
|
17012 | vector_t c(svd.solve(-grad_f)); |
300 |
2/2✓ Branch 1 taken 35548 times.
✓ Branch 2 taken 17012 times.
|
52560 | for (vector_t::Index j = 0; j < c.size(); ++j) { |
301 |
13/26✓ Branch 1 taken 35548 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 35548 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 35548 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 35548 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 35548 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 35548 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 35548 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 35548 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 35548 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 35548 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 35548 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 35548 times.
✗ Branch 38 not taken.
✗ Branch 47 not taken.
✓ Branch 48 taken 35548 times.
|
35548 | BOOST_CHECK_MESSAGE(c[j] >= -eps, |
302 | "c[" << j << "]{" << c[j] << "} is below " << -eps); | ||
303 | } | ||
304 | 17012 | } | |
305 | 20000 | } | |
306 |
5/10✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
|
2 | std::cerr << "nCol / nTotal = " << nCol << " / " << N << std::endl; |
307 |
3/6✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
|
2 | std::cerr << "nDiff = " << nDiff << std::endl; |
308 | // statistics | ||
309 | 2 | clock_t totalTimeGjkColl = 0; | |
310 | 2 | clock_t totalTimeGjkNoColl = 0; | |
311 |
2/2✓ Branch 0 taken 20000 times.
✓ Branch 1 taken 2 times.
|
20002 | for (std::size_t i = 0; i < N; ++i) { |
312 |
2/2✓ Branch 1 taken 5664 times.
✓ Branch 2 taken 14336 times.
|
20000 | if (results[i].collision) { |
313 | 5664 | totalTimeGjkColl += results[i].timeGjk; | |
314 | } else { | ||
315 | 14336 | totalTimeGjkNoColl += results[i].timeGjk; | |
316 | } | ||
317 | } | ||
318 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | std::cerr << "Total / average time gjk: " |
319 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2 | << totalTimeGjkNoColl + totalTimeGjkColl << ", " |
320 | 2 | << Scalar(totalTimeGjkNoColl + totalTimeGjkColl) / | |
321 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | Scalar(CLOCKS_PER_SEC * N) |
322 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2 | << "s" << std::endl; |
323 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2 | std::cerr << "-- Collisions -------------------------" << std::endl; |
324 |
3/6✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
|
2 | std::cerr << "Total / average time gjk: " << totalTimeGjkColl << ", " |
325 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2 | << Scalar(totalTimeGjkColl) / Scalar(CLOCKS_PER_SEC * nCol) << "s" |
326 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | << std::endl; |
327 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2 | std::cerr << "-- No collisions -------------------------" << std::endl; |
328 |
3/6✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
|
2 | std::cerr << "Total / average time gjk: " << totalTimeGjkNoColl << ", " |
329 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | << Scalar(totalTimeGjkNoColl) / Scalar(CLOCKS_PER_SEC * (N - nCol)) |
330 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2 | << "s" << std::endl; |
331 | 2 | } | |
332 | |||
333 |
33/66✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
|
4 | BOOST_AUTO_TEST_CASE(distance_triangle_triangle) { |
334 | 2 | test_gjk_distance_triangle_triangle(false); | |
335 | 2 | } | |
336 | |||
337 |
33/66✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
|
4 | BOOST_AUTO_TEST_CASE(distance_triangle_triangle_nesterov) { |
338 | 2 | test_gjk_distance_triangle_triangle(true); | |
339 | 2 | } | |
340 | |||
341 | 80 | void test_gjk_unit_sphere(Scalar center_distance, Vec3s ray, | |
342 | Scalar swept_sphere_radius, | ||
343 | bool use_gjk_nesterov_acceleration) { | ||
344 | using namespace coal; | ||
345 | 80 | const Scalar r = 1.0; | |
346 |
1/2✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
|
80 | Sphere sphere(r); |
347 |
1/2✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
|
80 | sphere.setSweptSphereRadius(swept_sphere_radius); |
348 | |||
349 | typedef Eigen::Matrix<Scalar, 4, 1> Vec4f; | ||
350 |
5/10✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 80 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 80 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 80 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 80 times.
✗ Branch 14 not taken.
|
80 | Transform3s tf0(Quats(Vec4f::Random().normalized()), Vec3s::Zero()); |
351 |
5/10✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 80 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 80 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 80 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 80 times.
✗ Branch 14 not taken.
|
80 | Transform3s tf1(Quats(Vec4f::Random().normalized()), center_distance * ray); |
352 | |||
353 | 80 | bool expect_collision = center_distance <= 2 * (r + swept_sphere_radius); | |
354 | |||
355 |
1/2✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
|
80 | details::MinkowskiDiff shape; |
356 |
1/2✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
|
80 | shape.set<details::SupportOptions::NoSweptSphere>(&sphere, &sphere, tf0, tf1); |
357 | |||
358 |
6/12✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 80 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 80 times.
✗ Branch 10 not taken.
✓ Branch 14 taken 80 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 80 times.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✓ Branch 22 taken 80 times.
|
80 | BOOST_CHECK_EQUAL(shape.swept_sphere_radius[0], |
359 | sphere.radius + sphere.getSweptSphereRadius()); | ||
360 |
6/12✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 80 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 80 times.
✗ Branch 10 not taken.
✓ Branch 14 taken 80 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 80 times.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✓ Branch 22 taken 80 times.
|
80 | BOOST_CHECK_EQUAL(shape.swept_sphere_radius[1], |
361 | sphere.radius + sphere.getSweptSphereRadius()); | ||
362 | |||
363 |
1/2✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
|
80 | details::GJK gjk(2, Scalar(1e-6)); |
364 |
2/2✓ Branch 0 taken 40 times.
✓ Branch 1 taken 40 times.
|
80 | if (use_gjk_nesterov_acceleration) |
365 | 40 | gjk.gjk_variant = GJKVariant::NesterovAcceleration; | |
366 |
4/8✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 80 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 80 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 80 times.
✗ Branch 11 not taken.
|
80 | details::GJK::Status status = gjk.evaluate(shape, Vec3ps(1, 0, 0)); |
367 | |||
368 |
2/2✓ Branch 0 taken 68 times.
✓ Branch 1 taken 12 times.
|
80 | if (expect_collision) { |
369 |
8/16✓ Branch 1 taken 68 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 68 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 68 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 68 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 68 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 68 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 68 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 68 times.
|
68 | BOOST_CHECK((status == details::GJK::Collision) || |
370 | (status == details::GJK::CollisionWithPenetrationInformation)); | ||
371 | // For sphere-sphere, if the distance between the centers is above GJK's | ||
372 | // tolerance, the `Collision` status should never be returned. | ||
373 |
8/16✓ Branch 1 taken 68 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 68 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 68 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 68 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 68 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 68 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 68 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 68 times.
|
68 | BOOST_CHECK(status == details::GJK::CollisionWithPenetrationInformation && |
374 | center_distance > gjk.getTolerance()); | ||
375 | } else { | ||
376 |
5/10✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 12 times.
|
12 | BOOST_CHECK_EQUAL(status, details::GJK::NoCollision); |
377 | } | ||
378 | |||
379 |
3/6✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 80 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 80 times.
✗ Branch 8 not taken.
|
80 | Vec3ps w0_, w1_, normal_; |
380 |
1/2✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
|
80 | gjk.getWitnessPointsAndNormal(shape, w0_, w1_, normal_); |
381 |
2/4✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 80 times.
✗ Branch 5 not taken.
|
80 | Vec3s w0 = w0_.cast<Scalar>(); |
382 |
2/4✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 80 times.
✗ Branch 5 not taken.
|
80 | Vec3s w1 = w1_.cast<Scalar>(); |
383 |
2/4✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 80 times.
✗ Branch 5 not taken.
|
80 | Vec3s normal = normal_.cast<Scalar>(); |
384 | |||
385 |
4/8✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 80 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 80 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 80 times.
✗ Branch 12 not taken.
|
80 | Vec3s w0_expected(tf0.inverse().transform(tf0.getTranslation() + ray) + |
386 |
2/4✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 80 times.
✗ Branch 5 not taken.
|
160 | swept_sphere_radius * normal); |
387 |
4/8✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 80 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 80 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 80 times.
✗ Branch 12 not taken.
|
80 | Vec3s w1_expected(tf0.inverse().transform(tf1.getTranslation() - ray) - |
388 |
2/4✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 80 times.
✗ Branch 5 not taken.
|
160 | swept_sphere_radius * normal); |
389 | |||
390 |
16/32✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 80 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 80 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 80 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 80 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 80 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 80 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 80 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 80 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 80 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 80 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 80 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 80 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 80 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 80 times.
✗ Branch 47 not taken.
✗ Branch 57 not taken.
✓ Branch 58 taken 80 times.
|
80 | EIGEN_VECTOR_IS_APPROX(w0, w0_expected, Scalar(1e-10)); |
391 |
16/32✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 80 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 80 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 80 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 80 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 80 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 80 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 80 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 80 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 80 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 80 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 80 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 80 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 80 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 80 times.
✗ Branch 47 not taken.
✗ Branch 57 not taken.
✓ Branch 58 taken 80 times.
|
80 | EIGEN_VECTOR_IS_APPROX(w1, w1_expected, Scalar(1e-10)); |
392 | 80 | } | |
393 | |||
394 |
33/66✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
|
4 | BOOST_AUTO_TEST_CASE(sphere_sphere) { |
395 | 2 | std::array<bool, 2> use_nesterov_acceleration = {false, true}; | |
396 | 2 | std::array<Scalar, 5> swept_sphere_radius = {0., Scalar(0.1), 1, 10, 100}; | |
397 |
2/2✓ Branch 2 taken 2 times.
✓ Branch 3 taken 1 times.
|
6 | for (bool nesterov_acceleration : use_nesterov_acceleration) { |
398 |
2/2✓ Branch 2 taken 10 times.
✓ Branch 3 taken 2 times.
|
24 | for (Scalar ssr : swept_sphere_radius) { |
399 |
2/4✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
20 | test_gjk_unit_sphere(3, Vec3s(1, 0, 0), ssr, nesterov_acceleration); |
400 | |||
401 |
2/4✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
20 | test_gjk_unit_sphere(Scalar(2.01), Vec3s(1, 0, 0), ssr, |
402 | nesterov_acceleration); | ||
403 | |||
404 |
2/4✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
20 | test_gjk_unit_sphere(2, Vec3s(1, 0, 0), ssr, nesterov_acceleration); |
405 | |||
406 |
2/4✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
20 | test_gjk_unit_sphere(1, Vec3s(1, 0, 0), ssr, nesterov_acceleration); |
407 | |||
408 | // Random rotation | ||
409 |
3/6✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
|
20 | test_gjk_unit_sphere(3, Vec3s::Random().normalized(), ssr, |
410 | nesterov_acceleration); | ||
411 | |||
412 |
3/6✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
|
20 | test_gjk_unit_sphere(Scalar(2.01), Vec3s::Random().normalized(), ssr, |
413 | nesterov_acceleration); | ||
414 | |||
415 |
3/6✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
|
20 | test_gjk_unit_sphere(2, Vec3s::Random().normalized(), ssr, |
416 | nesterov_acceleration); | ||
417 | |||
418 |
3/6✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
|
20 | test_gjk_unit_sphere(1, Vec3s::Random().normalized(), ssr, |
419 | nesterov_acceleration); | ||
420 | } | ||
421 | } | ||
422 | 2 | } | |
423 | |||
424 | 6 | void test_gjk_triangle_capsule(Vec3s T, bool expect_collision, | |
425 | bool use_gjk_nesterov_acceleration, | ||
426 | Vec3s w0_expected, Vec3s w1_expected) { | ||
427 | using namespace coal; | ||
428 |
1/2✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
|
6 | Capsule capsule(1., 2.); // Radius 1 and length 2 |
429 |
4/8✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
|
6 | TriangleP triangle(Vec3s(0., 0., 0.), Vec3s(1., 0., 0.), Vec3s(1., 1., 0.)); |
430 | |||
431 |
2/4✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
|
6 | Transform3s tf0, tf1; |
432 |
1/2✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
|
6 | tf1.setTranslation(T); |
433 | |||
434 |
1/2✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
|
6 | details::MinkowskiDiff shape; |
435 | // No need to take into account swept-sphere radius in supports computation | ||
436 | // when using GJK/EPA; after they have converged, these algos will correctly | ||
437 | // handle the swept-sphere radius of the shapes. | ||
438 |
1/2✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
|
6 | shape.set<details::SupportOptions::NoSweptSphere>(&capsule, &triangle, tf0, |
439 | tf1); | ||
440 | |||
441 |
6/12✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 6 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 6 times.
|
6 | BOOST_CHECK_EQUAL(shape.swept_sphere_radius[0], capsule.radius); |
442 |
6/12✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 6 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 6 times.
|
6 | BOOST_CHECK_EQUAL(shape.swept_sphere_radius[1], 0.); |
443 | |||
444 |
1/2✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
|
6 | details::GJK gjk(10, SolverScalar(1e-6)); |
445 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
6 | if (use_gjk_nesterov_acceleration) |
446 | 3 | gjk.gjk_variant = GJKVariant::NesterovAcceleration; | |
447 |
4/8✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
|
6 | details::GJK::Status status = gjk.evaluate(shape, Vec3ps(1, 0, 0)); |
448 | |||
449 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
|
6 | if (expect_collision) { |
450 |
9/16✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 4 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 2 times.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 4 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 4 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 4 times.
|
4 | BOOST_CHECK((status == details::GJK::Collision) || |
451 | (status == details::GJK::CollisionWithPenetrationInformation)); | ||
452 | } else { | ||
453 |
5/10✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
|
2 | BOOST_CHECK_EQUAL(status, details::GJK::NoCollision); |
454 | |||
455 | // Check that guess works as expected | ||
456 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | Vec3ps guess = gjk.getGuessFromSimplex(); |
457 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | details::GJK gjk2(3, SolverScalar(1e-6)); |
458 |
3/6✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
|
2 | details::GJK::Status status2 = gjk2.evaluate(shape, guess); |
459 |
5/10✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
|
2 | BOOST_CHECK_EQUAL(status2, details::GJK::NoCollision); |
460 | } | ||
461 | |||
462 |
3/6✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
|
6 | Vec3ps w0_, w1_, normal_; |
463 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
|
6 | if (status == details::GJK::NoCollision || |
464 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
|
4 | status == details::GJK::CollisionWithPenetrationInformation) { |
465 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | gjk.getWitnessPointsAndNormal(shape, w0_, w1_, normal_); |
466 | } else { | ||
467 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | details::EPA epa(64, SolverScalar(1e-6)); |
468 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2 | details::EPA::Status epa_status = epa.evaluate(gjk, Vec3ps(1, 0, 0)); |
469 |
5/10✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
|
2 | BOOST_CHECK_EQUAL(epa_status, details::EPA::AccuracyReached); |
470 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | epa.getWitnessPointsAndNormal(shape, w0_, w1_, normal_); |
471 | 2 | } | |
472 |
2/4✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
|
6 | Vec3s w0 = w0_.cast<Scalar>(); |
473 |
2/4✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
|
6 | Vec3s w1 = w1_.cast<Scalar>(); |
474 |
2/4✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
|
6 | Vec3s normal = normal_.cast<Scalar>(); |
475 | COAL_UNUSED_VARIABLE(normal); | ||
476 | |||
477 |
16/32✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 6 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 6 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 6 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 6 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 6 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 6 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 6 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 6 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 6 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 6 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 6 times.
✗ Branch 47 not taken.
✗ Branch 57 not taken.
✓ Branch 58 taken 6 times.
|
6 | EIGEN_VECTOR_IS_APPROX(w0, w0_expected, Scalar(1e-10)); |
478 |
18/36✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 6 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 6 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 6 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 6 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 6 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 6 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 6 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 6 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 6 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 6 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 6 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 6 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 6 times.
✗ Branch 53 not taken.
✗ Branch 63 not taken.
✓ Branch 64 taken 6 times.
|
6 | EIGEN_VECTOR_IS_APPROX(w1 - T, w1_expected, Scalar(1e-10)); |
479 | 6 | } | |
480 | |||
481 |
33/66✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
|
4 | BOOST_AUTO_TEST_CASE(triangle_capsule) { |
482 | // GJK -> no collision | ||
483 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | test_gjk_triangle_capsule(Vec3s(Scalar(1.01), 0, 0), false, false, |
484 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | Vec3s(1, 0, 0), Vec3s(0., 0, 0)); |
485 | // GJK + Nesterov acceleration -> no collision | ||
486 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | test_gjk_triangle_capsule(Vec3s(Scalar(1.01), 0, 0), false, true, |
487 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | Vec3s(1, 0, 0), Vec3s(0., 0, 0)); |
488 | |||
489 | // GJK -> collision | ||
490 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | test_gjk_triangle_capsule(Vec3s(Scalar(0.5), 0, 0), true, false, |
491 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | Vec3s(1, 0, 0), Vec3s(0., 0, 0)); |
492 | // GJK + Nesterov acceleration -> collision | ||
493 |
3/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
|
2 | test_gjk_triangle_capsule(Vec3s(0.5, 0, 0), true, true, Vec3s(1., 0, 0), |
494 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | Vec3s(0., 0, 0)); |
495 | |||
496 | // GJK + EPA -> collision | ||
497 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | test_gjk_triangle_capsule(Vec3s(Scalar(-0.5), Scalar(-0.01), 0), true, false, |
498 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | Vec3s(0, 1, 0), Vec3s(Scalar(0.5), 0, 0)); |
499 | // GJK + Nesterov accleration + EPA -> collision | ||
500 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | test_gjk_triangle_capsule(Vec3s(Scalar(-0.5), Scalar(-0.01), 0), true, true, |
501 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | Vec3s(0, 1, 0), Vec3s(Scalar(0.5), 0, 0)); |
502 | 2 | } | |
503 |