Directory: | ./ |
---|---|
File: | test/obb.cpp |
Date: | 2025-04-01 09:23:31 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 513 | 666 | 77.0% |
Branches: | 1015 | 2112 | 48.1% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | * Software License Agreement (BSD License) | ||
3 | * | ||
4 | * Copyright (c) 2014-2016, CNRS-LAAS | ||
5 | * Copyright (c) 2023, Inria | ||
6 | * Author: Florent Lamiraux | ||
7 | * All rights reserved. | ||
8 | * | ||
9 | * Redistribution and use in source and binary forms, with or without | ||
10 | * modification, are permitted provided that the following conditions | ||
11 | * are met: | ||
12 | * | ||
13 | * * Redistributions of source code must retain the above copyright | ||
14 | * notice, this list of conditions and the following disclaimer. | ||
15 | * * Redistributions in binary form must reproduce the above | ||
16 | * copyright notice, this list of conditions and the following | ||
17 | * disclaimer in the documentation and/or other materials provided | ||
18 | * with the distribution. | ||
19 | * * Neither the name of CNRS nor the names of its | ||
20 | * contributors may be used to endorse or promote products derived | ||
21 | * from this software without specific prior written permission. | ||
22 | * | ||
23 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
24 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
25 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
26 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
27 | * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
28 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
29 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
30 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
31 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
32 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
33 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
34 | * POSSIBILITY OF SUCH DAMAGE. | ||
35 | */ | ||
36 | |||
37 | #include <iostream> | ||
38 | #include <fstream> | ||
39 | #include <sstream> | ||
40 | |||
41 | #include <chrono> | ||
42 | |||
43 | #include "coal/narrowphase/narrowphase.h" | ||
44 | |||
45 | #include "../src/BV/OBB.h" | ||
46 | #include "coal/internal/shape_shape_func.h" | ||
47 | #include "utility.h" | ||
48 | |||
49 | using namespace coal; | ||
50 | |||
51 | 10 | void randomOBBs(Vec3s& a, Vec3s& b, Scalar extentNorm) { | |
52 | // Extent norm is between 0 and extentNorm on each axis | ||
53 | // a = (Vec3s::Ones()+Vec3s::Random()) * extentNorm / (2*sqrt(3)); | ||
54 | // b = (Vec3s::Ones()+Vec3s::Random()) * extentNorm / (2*sqrt(3)); | ||
55 | |||
56 |
4/8✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 10 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 10 times.
✗ Branch 12 not taken.
|
10 | a = extentNorm * Vec3s::Random().cwiseAbs().normalized(); |
57 |
4/8✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 10 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 10 times.
✗ Branch 12 not taken.
|
10 | b = extentNorm * Vec3s::Random().cwiseAbs().normalized(); |
58 | 10 | } | |
59 | |||
60 | 100 | void randomTransform(Matrix3s& B, Vec3s& T, const Vec3s& a, const Vec3s& b, | |
61 | const Scalar extentNorm) { | ||
62 | // TODO Should we scale T to a and b norm ? | ||
63 | (void)a; | ||
64 | (void)b; | ||
65 | (void)extentNorm; | ||
66 | |||
67 |
2/4✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
|
100 | Scalar N = a.norm() + b.norm(); |
68 | // A translation of norm N ensures there is no collision. | ||
69 | // Set translation to be between 0 and 2 * N; | ||
70 |
5/10✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 100 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 100 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 100 times.
✗ Branch 15 not taken.
|
100 | T = (Vec3s::Random() / sqrt(3)) * 1.5 * N; |
71 | // T.setZero(); | ||
72 | |||
73 |
1/2✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
|
100 | Quats q; |
74 |
1/2✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
|
100 | q.coeffs().setRandom(); |
75 |
1/2✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
|
100 | q.normalize(); |
76 |
1/2✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
|
100 | B = q; |
77 | 100 | } | |
78 | |||
79 | #define NB_METHODS 7 | ||
80 | #define MANUAL_PRODUCT 1 | ||
81 | |||
82 | #if MANUAL_PRODUCT | ||
83 | #define PRODUCT(M33, v3) \ | ||
84 | (M33.col(0) * v3[0] + M33.col(1) * v3[1] + M33.col(2) * v3[2]) | ||
85 | #else | ||
86 | #define PRODUCT(M33, v3) (M33 * v3) | ||
87 | #endif | ||
88 | |||
89 | typedef std::chrono::high_resolution_clock clock_type; | ||
90 | typedef clock_type::duration duration_type; | ||
91 | |||
92 | const char* sep = ",\t"; | ||
93 | const Scalar eps = Scalar(1.5e-7); | ||
94 | |||
95 | const Eigen::IOFormat py_fmt(Eigen::FullPrecision, 0, | ||
96 | ", ", // Coeff separator | ||
97 | ",\n", // Row separator | ||
98 | "(", // row prefix | ||
99 | ",)", // row suffix | ||
100 | "( ", // mat prefix | ||
101 | ", )" // mat suffix | ||
102 | ); | ||
103 | |||
104 | namespace obbDisjoint_impls { | ||
105 | /// @return true if OBB are disjoint. | ||
106 | 100 | bool distance(const Matrix3s& B, const Vec3s& T, const Vec3s& a, const Vec3s& b, | |
107 | Scalar& distance) { | ||
108 |
1/2✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
|
100 | GJKSolver gjk; |
109 |
6/12✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 100 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 100 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 100 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 100 times.
✗ Branch 17 not taken.
|
100 | Box ba(2 * a), bb(2 * b); |
110 |
2/4✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
|
100 | Transform3s tfa, tfb(B, T); |
111 | |||
112 |
3/6✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 100 times.
✗ Branch 8 not taken.
|
100 | Vec3s p1, p2, normal; |
113 | 100 | bool compute_penetration = true; | |
114 | 100 | distance = | |
115 |
1/2✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
|
100 | gjk.shapeDistance(ba, tfa, bb, tfb, compute_penetration, p1, p2, normal); |
116 |
1/2✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
|
200 | return (distance > gjk.getDistancePrecision(compute_penetration)); |
117 | 100 | } | |
118 | |||
119 | 4100 | inline Scalar _computeDistanceForCase1(const Vec3s& T, const Vec3s& a, | |
120 | const Vec3s& b, const Matrix3s& Bf) { | ||
121 |
1/2✓ Branch 1 taken 4100 times.
✗ Branch 2 not taken.
|
4100 | Vec3s AABB_corner; |
122 | /* This seems to be slower | ||
123 | AABB_corner.noalias() = T.cwiseAbs () - a; | ||
124 | AABB_corner.noalias() -= PRODUCT(Bf,b); | ||
125 | /*/ | ||
126 | #if MANUAL_PRODUCT | ||
127 |
4/8✓ Branch 1 taken 4100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4100 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4100 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4100 times.
✗ Branch 11 not taken.
|
4100 | AABB_corner.noalias() = T.cwiseAbs() - a; |
128 |
5/10✓ Branch 1 taken 4100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4100 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4100 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4100 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4100 times.
✗ Branch 14 not taken.
|
4100 | AABB_corner.noalias() -= Bf.col(0) * b[0]; |
129 |
5/10✓ Branch 1 taken 4100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4100 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4100 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4100 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4100 times.
✗ Branch 14 not taken.
|
4100 | AABB_corner.noalias() -= Bf.col(1) * b[1]; |
130 |
5/10✓ Branch 1 taken 4100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4100 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4100 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4100 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4100 times.
✗ Branch 14 not taken.
|
4100 | AABB_corner.noalias() -= Bf.col(2) * b[2]; |
131 | #else | ||
132 | AABB_corner.noalias() = T.cwiseAbs() - Bf * b - a; | ||
133 | #endif | ||
134 | // */ | ||
135 |
4/8✓ Branch 1 taken 4100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4100 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4100 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4100 times.
✗ Branch 11 not taken.
|
4100 | return AABB_corner.array().max(Scalar(0)).matrix().squaredNorm(); |
136 | } | ||
137 | |||
138 | 1435 | inline Scalar _computeDistanceForCase2(const Matrix3s& B, const Vec3s& T, | |
139 | const Vec3s& a, const Vec3s& b, | ||
140 | const Matrix3s& Bf) { | ||
141 | /* | ||
142 | Vec3s AABB_corner(PRODUCT(B.transpose(), T).cwiseAbs() - b); | ||
143 | AABB_corner.noalias() -= PRODUCT(Bf.transpose(), a); | ||
144 | return AABB_corner.array().max(Scalar(0)).matrix().squaredNorm (); | ||
145 | /*/ | ||
146 | #if MANUAL_PRODUCT | ||
147 | 1435 | Scalar s, t = 0; | |
148 |
4/8✓ Branch 2 taken 1435 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1435 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1435 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1435 times.
✗ Branch 13 not taken.
|
1435 | s = std::abs(B.col(0).dot(T)) - Bf.col(0).dot(a) - b[0]; |
149 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1435 times.
|
1435 | if (s > 0) t += s * s; |
150 |
4/8✓ Branch 2 taken 1435 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1435 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1435 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1435 times.
✗ Branch 13 not taken.
|
1435 | s = std::abs(B.col(1).dot(T)) - Bf.col(1).dot(a) - b[1]; |
151 |
2/2✓ Branch 0 taken 82 times.
✓ Branch 1 taken 1353 times.
|
1435 | if (s > 0) t += s * s; |
152 |
4/8✓ Branch 2 taken 1435 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1435 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1435 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1435 times.
✗ Branch 13 not taken.
|
1435 | s = std::abs(B.col(2).dot(T)) - Bf.col(2).dot(a) - b[2]; |
153 |
2/2✓ Branch 0 taken 82 times.
✓ Branch 1 taken 1353 times.
|
1435 | if (s > 0) t += s * s; |
154 | 1435 | return t; | |
155 | #else | ||
156 | Vec3s AABB_corner((B.transpose() * T).cwiseAbs() - Bf.transpose() * a - b); | ||
157 | return AABB_corner.array().max(Scalar(0)).matrix().squaredNorm(); | ||
158 | #endif | ||
159 | // */ | ||
160 | } | ||
161 | |||
162 | 100 | int separatingAxisId(const Matrix3s& B, const Vec3s& T, const Vec3s& a, | |
163 | const Vec3s& b, const Scalar& breakDistance2, | ||
164 | Scalar& squaredLowerBoundDistance) { | ||
165 | 100 | int id = 0; | |
166 | |||
167 |
2/4✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
|
100 | Matrix3s Bf(B.cwiseAbs()); |
168 | |||
169 | // Corner of b axis aligned bounding box the closest to the origin | ||
170 |
1/2✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
|
100 | squaredLowerBoundDistance = _computeDistanceForCase1(T, a, b, Bf); |
171 |
2/2✓ Branch 0 taken 65 times.
✓ Branch 1 taken 35 times.
|
100 | if (squaredLowerBoundDistance > breakDistance2) return id; |
172 | 35 | ++id; | |
173 | |||
174 | // | B^T T| - b - Bf^T a | ||
175 |
1/2✓ Branch 1 taken 35 times.
✗ Branch 2 not taken.
|
35 | squaredLowerBoundDistance = _computeDistanceForCase2(B, T, a, b, Bf); |
176 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 31 times.
|
35 | if (squaredLowerBoundDistance > breakDistance2) return id; |
177 | 31 | ++id; | |
178 | |||
179 | 31 | int ja = 1, ka = 2, jb = 1, kb = 2; | |
180 |
2/2✓ Branch 0 taken 91 times.
✓ Branch 1 taken 29 times.
|
120 | for (int ia = 0; ia < 3; ++ia) { |
181 |
2/2✓ Branch 0 taken 273 times.
✓ Branch 1 taken 89 times.
|
362 | for (int ib = 0; ib < 3; ++ib) { |
182 |
4/8✓ Branch 1 taken 273 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 273 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 273 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 273 times.
✗ Branch 11 not taken.
|
273 | const Scalar s = T[ka] * B(ja, ib) - T[ja] * B(ka, ib); |
183 | |||
184 |
4/8✓ Branch 1 taken 273 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 273 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 273 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 273 times.
✗ Branch 11 not taken.
|
273 | const Scalar diff = fabs(s) - (a[ja] * Bf(ka, ib) + a[ka] * Bf(ja, ib) + |
185 |
4/8✓ Branch 1 taken 273 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 273 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 273 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 273 times.
✗ Branch 11 not taken.
|
273 | b[jb] * Bf(ia, kb) + b[kb] * Bf(ia, jb)); |
186 | // We need to divide by the norm || Aia x Bib || | ||
187 | // As ||Aia|| = ||Bib|| = 1, (Aia | Bib)^2 = cosine^2 | ||
188 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 271 times.
|
273 | if (diff > 0) { |
189 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2 | Scalar sinus2 = 1 - Bf(ia, ib) * Bf(ia, ib); |
190 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2 | if (sinus2 > 1e-6) { |
191 | 2 | squaredLowerBoundDistance = diff * diff / sinus2; | |
192 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2 | if (squaredLowerBoundDistance > breakDistance2) { |
193 | 2 | return id; | |
194 | } | ||
195 | } | ||
196 | /* // or | ||
197 | Scalar sinus2 = 1 - Bf (ia,ib) * Bf (ia,ib); | ||
198 | squaredLowerBoundDistance = diff * diff; | ||
199 | if (squaredLowerBoundDistance > breakDistance2 * sinus2) { | ||
200 | squaredLowerBoundDistance /= sinus2; | ||
201 | return true; | ||
202 | } | ||
203 | // */ | ||
204 | } | ||
205 | 271 | ++id; | |
206 | |||
207 | 271 | jb = kb; | |
208 | 271 | kb = ib; | |
209 | } | ||
210 | 89 | ja = ka; | |
211 | 89 | ka = ia; | |
212 | } | ||
213 | |||
214 | 29 | return id; | |
215 | } | ||
216 | |||
217 | // ------------------------ 0 -------------------------------------- | ||
218 | 1000 | bool withRuntimeLoop(const Matrix3s& B, const Vec3s& T, const Vec3s& a, | |
219 | const Vec3s& b, const Scalar& breakDistance2, | ||
220 | Scalar& squaredLowerBoundDistance) { | ||
221 |
2/4✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
|
1000 | Matrix3s Bf(B.cwiseAbs()); |
222 | |||
223 | // Corner of b axis aligned bounding box the closest to the origin | ||
224 |
1/2✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
|
1000 | squaredLowerBoundDistance = _computeDistanceForCase1(T, a, b, Bf); |
225 |
2/2✓ Branch 0 taken 650 times.
✓ Branch 1 taken 350 times.
|
1000 | if (squaredLowerBoundDistance > breakDistance2) return true; |
226 | |||
227 | // | B^T T| - b - Bf^T a | ||
228 |
1/2✓ Branch 1 taken 350 times.
✗ Branch 2 not taken.
|
350 | squaredLowerBoundDistance = _computeDistanceForCase2(B, T, a, b, Bf); |
229 |
2/2✓ Branch 0 taken 40 times.
✓ Branch 1 taken 310 times.
|
350 | if (squaredLowerBoundDistance > breakDistance2) return true; |
230 | |||
231 | 310 | int ja = 1, ka = 2, jb = 1, kb = 2; | |
232 |
2/2✓ Branch 0 taken 910 times.
✓ Branch 1 taken 290 times.
|
1200 | for (int ia = 0; ia < 3; ++ia) { |
233 |
2/2✓ Branch 0 taken 2730 times.
✓ Branch 1 taken 890 times.
|
3620 | for (int ib = 0; ib < 3; ++ib) { |
234 |
4/8✓ Branch 1 taken 2730 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2730 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2730 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2730 times.
✗ Branch 11 not taken.
|
2730 | const Scalar s = T[ka] * B(ja, ib) - T[ja] * B(ka, ib); |
235 | |||
236 |
4/8✓ Branch 1 taken 2730 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2730 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2730 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2730 times.
✗ Branch 11 not taken.
|
2730 | const Scalar diff = fabs(s) - (a[ja] * Bf(ka, ib) + a[ka] * Bf(ja, ib) + |
237 |
4/8✓ Branch 1 taken 2730 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2730 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2730 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2730 times.
✗ Branch 11 not taken.
|
2730 | b[jb] * Bf(ia, kb) + b[kb] * Bf(ia, jb)); |
238 | // We need to divide by the norm || Aia x Bib || | ||
239 | // As ||Aia|| = ||Bib|| = 1, (Aia | Bib)^2 = cosine^2 | ||
240 |
2/2✓ Branch 0 taken 20 times.
✓ Branch 1 taken 2710 times.
|
2730 | if (diff > 0) { |
241 |
2/4✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
|
20 | Scalar sinus2 = 1 - Bf(ia, ib) * Bf(ia, ib); |
242 |
1/2✓ Branch 0 taken 20 times.
✗ Branch 1 not taken.
|
20 | if (sinus2 > 1e-6) { |
243 | 20 | squaredLowerBoundDistance = diff * diff / sinus2; | |
244 |
1/2✓ Branch 0 taken 20 times.
✗ Branch 1 not taken.
|
20 | if (squaredLowerBoundDistance > breakDistance2) { |
245 | 20 | return true; | |
246 | } | ||
247 | } | ||
248 | /* // or | ||
249 | Scalar sinus2 = 1 - Bf (ia,ib) * Bf (ia,ib); | ||
250 | squaredLowerBoundDistance = diff * diff; | ||
251 | if (squaredLowerBoundDistance > breakDistance2 * sinus2) { | ||
252 | squaredLowerBoundDistance /= sinus2; | ||
253 | return true; | ||
254 | } | ||
255 | // */ | ||
256 | } | ||
257 | |||
258 | 2710 | jb = kb; | |
259 | 2710 | kb = ib; | |
260 | } | ||
261 | 890 | ja = ka; | |
262 | 890 | ka = ia; | |
263 | } | ||
264 | |||
265 | 290 | return false; | |
266 | } | ||
267 | |||
268 | // ------------------------ 1 -------------------------------------- | ||
269 | 1000 | bool withManualLoopUnrolling_1(const Matrix3s& B, const Vec3s& T, | |
270 | const Vec3s& a, const Vec3s& b, | ||
271 | const Scalar& breakDistance2, | ||
272 | Scalar& squaredLowerBoundDistance) { | ||
273 | Scalar t, s; | ||
274 | Scalar diff; | ||
275 | |||
276 | // Matrix3s Bf = abs(B); | ||
277 | // Bf += reps; | ||
278 |
2/4✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
|
1000 | Matrix3s Bf(B.cwiseAbs()); |
279 | |||
280 | // Corner of b axis aligned bounding box the closest to the origin | ||
281 |
4/8✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1000 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1000 times.
✗ Branch 11 not taken.
|
1000 | Vec3s AABB_corner(T.cwiseAbs() - Bf * b); |
282 |
2/4✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
|
1000 | Vec3s diff3(AABB_corner - a); |
283 |
3/6✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1000 times.
✗ Branch 8 not taken.
|
1000 | diff3 = diff3.cwiseMax(Vec3s::Zero()); |
284 | |||
285 | // for (Vec3s::Index i=0; i<3; ++i) diff3 [i] = std::max (0, diff3 [i]); | ||
286 |
1/2✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
|
1000 | squaredLowerBoundDistance = diff3.squaredNorm(); |
287 |
2/2✓ Branch 0 taken 650 times.
✓ Branch 1 taken 350 times.
|
1000 | if (squaredLowerBoundDistance > breakDistance2) return true; |
288 | |||
289 |
7/14✓ Branch 1 taken 350 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 350 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 350 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 350 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 350 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 350 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 350 times.
✗ Branch 20 not taken.
|
350 | AABB_corner = (B.transpose() * T).cwiseAbs() - Bf.transpose() * a; |
290 | // diff3 = | B^T T| - b - Bf^T a | ||
291 |
2/4✓ Branch 1 taken 350 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 350 times.
✗ Branch 5 not taken.
|
350 | diff3 = AABB_corner - b; |
292 |
3/6✓ Branch 1 taken 350 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 350 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 350 times.
✗ Branch 8 not taken.
|
350 | diff3 = diff3.cwiseMax(Vec3s::Zero()); |
293 |
1/2✓ Branch 1 taken 350 times.
✗ Branch 2 not taken.
|
350 | squaredLowerBoundDistance = diff3.squaredNorm(); |
294 | |||
295 |
2/2✓ Branch 0 taken 40 times.
✓ Branch 1 taken 310 times.
|
350 | if (squaredLowerBoundDistance > breakDistance2) return true; |
296 | |||
297 | // A0 x B0 | ||
298 |
4/8✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
|
310 | s = T[2] * B(1, 0) - T[1] * B(2, 0); |
299 |
2/2✓ Branch 0 taken 180 times.
✓ Branch 1 taken 130 times.
|
310 | t = ((s < 0.0) ? -s : s); |
300 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 310 times.
|
310 | assert(t == fabs(s)); |
301 | |||
302 | Scalar sinus2; | ||
303 |
6/12✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 310 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 310 times.
✗ Branch 17 not taken.
|
310 | diff = t - (a[1] * Bf(2, 0) + a[2] * Bf(1, 0) + b[1] * Bf(0, 2) + |
304 |
2/4✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
|
310 | b[2] * Bf(0, 1)); |
305 | // We need to divide by the norm || A0 x B0 || | ||
306 | // As ||A0|| = ||B0|| = 1, | ||
307 | // 2 2 | ||
308 | // || A0 x B0 || + (A0 | B0) = 1 | ||
309 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 310 times.
|
310 | if (diff > 0) { |
310 | ✗ | sinus2 = 1 - Bf(0, 0) * Bf(0, 0); | |
311 | ✗ | if (sinus2 > 1e-6) { | |
312 | ✗ | squaredLowerBoundDistance = diff * diff / sinus2; | |
313 | ✗ | if (squaredLowerBoundDistance > breakDistance2) { | |
314 | ✗ | return true; | |
315 | } | ||
316 | } | ||
317 | } | ||
318 | |||
319 | // A0 x B1 | ||
320 |
4/8✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
|
310 | s = T[2] * B(1, 1) - T[1] * B(2, 1); |
321 |
2/2✓ Branch 0 taken 150 times.
✓ Branch 1 taken 160 times.
|
310 | t = ((s < 0.0) ? -s : s); |
322 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 310 times.
|
310 | assert(t == fabs(s)); |
323 | |||
324 |
6/12✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 310 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 310 times.
✗ Branch 17 not taken.
|
310 | diff = t - (a[1] * Bf(2, 1) + a[2] * Bf(1, 1) + b[0] * Bf(0, 2) + |
325 |
2/4✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
|
310 | b[2] * Bf(0, 0)); |
326 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 310 times.
|
310 | if (diff > 0) { |
327 | ✗ | sinus2 = 1 - Bf(0, 1) * Bf(0, 1); | |
328 | ✗ | if (sinus2 > 1e-6) { | |
329 | ✗ | squaredLowerBoundDistance = diff * diff / sinus2; | |
330 | ✗ | if (squaredLowerBoundDistance > breakDistance2) { | |
331 | ✗ | return true; | |
332 | } | ||
333 | } | ||
334 | } | ||
335 | |||
336 | // A0 x B2 | ||
337 |
4/8✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
|
310 | s = T[2] * B(1, 2) - T[1] * B(2, 2); |
338 |
2/2✓ Branch 0 taken 200 times.
✓ Branch 1 taken 110 times.
|
310 | t = ((s < 0.0) ? -s : s); |
339 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 310 times.
|
310 | assert(t == fabs(s)); |
340 | |||
341 |
6/12✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 310 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 310 times.
✗ Branch 17 not taken.
|
310 | diff = t - (a[1] * Bf(2, 2) + a[2] * Bf(1, 2) + b[0] * Bf(0, 1) + |
342 |
2/4✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
|
310 | b[1] * Bf(0, 0)); |
343 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 300 times.
|
310 | if (diff > 0) { |
344 |
2/4✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
10 | sinus2 = 1 - Bf(0, 2) * Bf(0, 2); |
345 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (sinus2 > 1e-6) { |
346 | 10 | squaredLowerBoundDistance = diff * diff / sinus2; | |
347 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (squaredLowerBoundDistance > breakDistance2) { |
348 | 10 | return true; | |
349 | } | ||
350 | } | ||
351 | } | ||
352 | |||
353 | // A1 x B0 | ||
354 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[0] * B(2, 0) - T[2] * B(0, 0); |
355 |
2/2✓ Branch 0 taken 150 times.
✓ Branch 1 taken 150 times.
|
300 | t = ((s < 0.0) ? -s : s); |
356 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | assert(t == fabs(s)); |
357 | |||
358 |
6/12✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
|
300 | diff = t - (a[0] * Bf(2, 0) + a[2] * Bf(0, 0) + b[1] * Bf(1, 2) + |
359 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
|
300 | b[2] * Bf(1, 1)); |
360 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | if (diff > 0) { |
361 | ✗ | sinus2 = 1 - Bf(1, 0) * Bf(1, 0); | |
362 | ✗ | if (sinus2 > 1e-6) { | |
363 | ✗ | squaredLowerBoundDistance = diff * diff / sinus2; | |
364 | ✗ | if (squaredLowerBoundDistance > breakDistance2) { | |
365 | ✗ | return true; | |
366 | } | ||
367 | } | ||
368 | } | ||
369 | |||
370 | // A1 x B1 | ||
371 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[0] * B(2, 1) - T[2] * B(0, 1); |
372 |
2/2✓ Branch 0 taken 190 times.
✓ Branch 1 taken 110 times.
|
300 | t = ((s < 0.0) ? -s : s); |
373 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | assert(t == fabs(s)); |
374 | |||
375 |
6/12✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
|
300 | diff = t - (a[0] * Bf(2, 1) + a[2] * Bf(0, 1) + b[0] * Bf(1, 2) + |
376 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
|
300 | b[2] * Bf(1, 0)); |
377 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | if (diff > 0) { |
378 | ✗ | sinus2 = 1 - Bf(1, 1) * Bf(1, 1); | |
379 | ✗ | if (sinus2 > 1e-6) { | |
380 | ✗ | squaredLowerBoundDistance = diff * diff / sinus2; | |
381 | ✗ | if (squaredLowerBoundDistance > breakDistance2) { | |
382 | ✗ | return true; | |
383 | } | ||
384 | } | ||
385 | } | ||
386 | |||
387 | // A1 x B2 | ||
388 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[0] * B(2, 2) - T[2] * B(0, 2); |
389 |
2/2✓ Branch 0 taken 120 times.
✓ Branch 1 taken 180 times.
|
300 | t = ((s < 0.0) ? -s : s); |
390 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | assert(t == fabs(s)); |
391 | |||
392 |
6/12✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
|
300 | diff = t - (a[0] * Bf(2, 2) + a[2] * Bf(0, 2) + b[0] * Bf(1, 1) + |
393 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
|
300 | b[1] * Bf(1, 0)); |
394 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | if (diff > 0) { |
395 | ✗ | sinus2 = 1 - Bf(1, 2) * Bf(1, 2); | |
396 | ✗ | if (sinus2 > 1e-6) { | |
397 | ✗ | squaredLowerBoundDistance = diff * diff / sinus2; | |
398 | ✗ | if (squaredLowerBoundDistance > breakDistance2) { | |
399 | ✗ | return true; | |
400 | } | ||
401 | } | ||
402 | } | ||
403 | |||
404 | // A2 x B0 | ||
405 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[1] * B(0, 0) - T[0] * B(1, 0); |
406 |
2/2✓ Branch 0 taken 180 times.
✓ Branch 1 taken 120 times.
|
300 | t = ((s < 0.0) ? -s : s); |
407 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | assert(t == fabs(s)); |
408 | |||
409 |
6/12✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
|
300 | diff = t - (a[0] * Bf(1, 0) + a[1] * Bf(0, 0) + b[1] * Bf(2, 2) + |
410 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
|
300 | b[2] * Bf(2, 1)); |
411 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | if (diff > 0) { |
412 | ✗ | sinus2 = 1 - Bf(2, 0) * Bf(2, 0); | |
413 | ✗ | if (sinus2 > 1e-6) { | |
414 | ✗ | squaredLowerBoundDistance = diff * diff / sinus2; | |
415 | ✗ | if (squaredLowerBoundDistance > breakDistance2) { | |
416 | ✗ | return true; | |
417 | } | ||
418 | } | ||
419 | } | ||
420 | |||
421 | // A2 x B1 | ||
422 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[1] * B(0, 1) - T[0] * B(1, 1); |
423 |
2/2✓ Branch 0 taken 120 times.
✓ Branch 1 taken 180 times.
|
300 | t = ((s < 0.0) ? -s : s); |
424 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | assert(t == fabs(s)); |
425 | |||
426 |
6/12✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
|
300 | diff = t - (a[0] * Bf(1, 1) + a[1] * Bf(0, 1) + b[0] * Bf(2, 2) + |
427 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
|
300 | b[2] * Bf(2, 0)); |
428 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | if (diff > 0) { |
429 | ✗ | sinus2 = 1 - Bf(2, 1) * Bf(2, 1); | |
430 | ✗ | if (sinus2 > 1e-6) { | |
431 | ✗ | squaredLowerBoundDistance = diff * diff / sinus2; | |
432 | ✗ | if (squaredLowerBoundDistance > breakDistance2) { | |
433 | ✗ | return true; | |
434 | } | ||
435 | } | ||
436 | } | ||
437 | |||
438 | // A2 x B2 | ||
439 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[1] * B(0, 2) - T[0] * B(1, 2); |
440 |
2/2✓ Branch 0 taken 170 times.
✓ Branch 1 taken 130 times.
|
300 | t = ((s < 0.0) ? -s : s); |
441 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | assert(t == fabs(s)); |
442 | |||
443 |
6/12✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
|
300 | diff = t - (a[0] * Bf(1, 2) + a[1] * Bf(0, 2) + b[0] * Bf(2, 1) + |
444 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
|
300 | b[1] * Bf(2, 0)); |
445 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 290 times.
|
300 | if (diff > 0) { |
446 |
2/4✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
10 | sinus2 = 1 - Bf(2, 2) * Bf(2, 2); |
447 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (sinus2 > 1e-6) { |
448 | 10 | squaredLowerBoundDistance = diff * diff / sinus2; | |
449 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (squaredLowerBoundDistance > breakDistance2) { |
450 | 10 | return true; | |
451 | } | ||
452 | } | ||
453 | } | ||
454 | |||
455 | 290 | return false; | |
456 | } | ||
457 | |||
458 | // ------------------------ 2 -------------------------------------- | ||
459 | 1000 | bool withManualLoopUnrolling_2(const Matrix3s& B, const Vec3s& T, | |
460 | const Vec3s& a, const Vec3s& b, | ||
461 | const Scalar& breakDistance2, | ||
462 | Scalar& squaredLowerBoundDistance) { | ||
463 |
2/4✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
|
1000 | Matrix3s Bf(B.cwiseAbs()); |
464 | |||
465 | // Corner of b axis aligned bounding box the closest to the origin | ||
466 |
1/2✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
|
1000 | squaredLowerBoundDistance = _computeDistanceForCase1(T, a, b, Bf); |
467 |
2/2✓ Branch 0 taken 650 times.
✓ Branch 1 taken 350 times.
|
1000 | if (squaredLowerBoundDistance > breakDistance2) return true; |
468 | |||
469 |
1/2✓ Branch 1 taken 350 times.
✗ Branch 2 not taken.
|
350 | squaredLowerBoundDistance = _computeDistanceForCase2(B, T, a, b, Bf); |
470 |
2/2✓ Branch 0 taken 40 times.
✓ Branch 1 taken 310 times.
|
350 | if (squaredLowerBoundDistance > breakDistance2) return true; |
471 | |||
472 | // A0 x B0 | ||
473 | Scalar t, s; | ||
474 |
4/8✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
|
310 | s = T[2] * B(1, 0) - T[1] * B(2, 0); |
475 |
2/2✓ Branch 0 taken 180 times.
✓ Branch 1 taken 130 times.
|
310 | t = ((s < 0.0) ? -s : s); |
476 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 310 times.
|
310 | assert(t == fabs(s)); |
477 | |||
478 | Scalar sinus2; | ||
479 | Scalar diff; | ||
480 |
6/12✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 310 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 310 times.
✗ Branch 17 not taken.
|
310 | diff = t - (a[1] * Bf(2, 0) + a[2] * Bf(1, 0) + b[1] * Bf(0, 2) + |
481 |
2/4✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
|
310 | b[2] * Bf(0, 1)); |
482 | // We need to divide by the norm || A0 x B0 || | ||
483 | // As ||A0|| = ||B0|| = 1, | ||
484 | // 2 2 | ||
485 | // || A0 x B0 || + (A0 | B0) = 1 | ||
486 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 310 times.
|
310 | if (diff > 0) { |
487 | ✗ | sinus2 = 1 - Bf(0, 0) * Bf(0, 0); | |
488 | ✗ | if (sinus2 > 1e-6) { | |
489 | ✗ | squaredLowerBoundDistance = diff * diff / sinus2; | |
490 | ✗ | if (squaredLowerBoundDistance > breakDistance2) { | |
491 | ✗ | return true; | |
492 | } | ||
493 | } | ||
494 | } | ||
495 | |||
496 | // A0 x B1 | ||
497 |
4/8✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
|
310 | s = T[2] * B(1, 1) - T[1] * B(2, 1); |
498 |
2/2✓ Branch 0 taken 150 times.
✓ Branch 1 taken 160 times.
|
310 | t = ((s < 0.0) ? -s : s); |
499 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 310 times.
|
310 | assert(t == fabs(s)); |
500 | |||
501 |
6/12✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 310 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 310 times.
✗ Branch 17 not taken.
|
310 | diff = t - (a[1] * Bf(2, 1) + a[2] * Bf(1, 1) + b[0] * Bf(0, 2) + |
502 |
2/4✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
|
310 | b[2] * Bf(0, 0)); |
503 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 310 times.
|
310 | if (diff > 0) { |
504 | ✗ | sinus2 = 1 - Bf(0, 1) * Bf(0, 1); | |
505 | ✗ | if (sinus2 > 1e-6) { | |
506 | ✗ | squaredLowerBoundDistance = diff * diff / sinus2; | |
507 | ✗ | if (squaredLowerBoundDistance > breakDistance2) { | |
508 | ✗ | return true; | |
509 | } | ||
510 | } | ||
511 | } | ||
512 | |||
513 | // A0 x B2 | ||
514 |
4/8✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
|
310 | s = T[2] * B(1, 2) - T[1] * B(2, 2); |
515 |
2/2✓ Branch 0 taken 200 times.
✓ Branch 1 taken 110 times.
|
310 | t = ((s < 0.0) ? -s : s); |
516 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 310 times.
|
310 | assert(t == fabs(s)); |
517 | |||
518 |
6/12✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 310 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 310 times.
✗ Branch 17 not taken.
|
310 | diff = t - (a[1] * Bf(2, 2) + a[2] * Bf(1, 2) + b[0] * Bf(0, 1) + |
519 |
2/4✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
|
310 | b[1] * Bf(0, 0)); |
520 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 300 times.
|
310 | if (diff > 0) { |
521 |
2/4✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
10 | sinus2 = 1 - Bf(0, 2) * Bf(0, 2); |
522 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (sinus2 > 1e-6) { |
523 | 10 | squaredLowerBoundDistance = diff * diff / sinus2; | |
524 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (squaredLowerBoundDistance > breakDistance2) { |
525 | 10 | return true; | |
526 | } | ||
527 | } | ||
528 | } | ||
529 | |||
530 | // A1 x B0 | ||
531 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[0] * B(2, 0) - T[2] * B(0, 0); |
532 |
2/2✓ Branch 0 taken 150 times.
✓ Branch 1 taken 150 times.
|
300 | t = ((s < 0.0) ? -s : s); |
533 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | assert(t == fabs(s)); |
534 | |||
535 |
6/12✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
|
300 | diff = t - (a[0] * Bf(2, 0) + a[2] * Bf(0, 0) + b[1] * Bf(1, 2) + |
536 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
|
300 | b[2] * Bf(1, 1)); |
537 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | if (diff > 0) { |
538 | ✗ | sinus2 = 1 - Bf(1, 0) * Bf(1, 0); | |
539 | ✗ | if (sinus2 > 1e-6) { | |
540 | ✗ | squaredLowerBoundDistance = diff * diff / sinus2; | |
541 | ✗ | if (squaredLowerBoundDistance > breakDistance2) { | |
542 | ✗ | return true; | |
543 | } | ||
544 | } | ||
545 | } | ||
546 | |||
547 | // A1 x B1 | ||
548 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[0] * B(2, 1) - T[2] * B(0, 1); |
549 |
2/2✓ Branch 0 taken 190 times.
✓ Branch 1 taken 110 times.
|
300 | t = ((s < 0.0) ? -s : s); |
550 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | assert(t == fabs(s)); |
551 | |||
552 |
6/12✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
|
300 | diff = t - (a[0] * Bf(2, 1) + a[2] * Bf(0, 1) + b[0] * Bf(1, 2) + |
553 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
|
300 | b[2] * Bf(1, 0)); |
554 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | if (diff > 0) { |
555 | ✗ | sinus2 = 1 - Bf(1, 1) * Bf(1, 1); | |
556 | ✗ | if (sinus2 > 1e-6) { | |
557 | ✗ | squaredLowerBoundDistance = diff * diff / sinus2; | |
558 | ✗ | if (squaredLowerBoundDistance > breakDistance2) { | |
559 | ✗ | return true; | |
560 | } | ||
561 | } | ||
562 | } | ||
563 | |||
564 | // A1 x B2 | ||
565 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[0] * B(2, 2) - T[2] * B(0, 2); |
566 |
2/2✓ Branch 0 taken 120 times.
✓ Branch 1 taken 180 times.
|
300 | t = ((s < 0.0) ? -s : s); |
567 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | assert(t == fabs(s)); |
568 | |||
569 |
6/12✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
|
300 | diff = t - (a[0] * Bf(2, 2) + a[2] * Bf(0, 2) + b[0] * Bf(1, 1) + |
570 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
|
300 | b[1] * Bf(1, 0)); |
571 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | if (diff > 0) { |
572 | ✗ | sinus2 = 1 - Bf(1, 2) * Bf(1, 2); | |
573 | ✗ | if (sinus2 > 1e-6) { | |
574 | ✗ | squaredLowerBoundDistance = diff * diff / sinus2; | |
575 | ✗ | if (squaredLowerBoundDistance > breakDistance2) { | |
576 | ✗ | return true; | |
577 | } | ||
578 | } | ||
579 | } | ||
580 | |||
581 | // A2 x B0 | ||
582 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[1] * B(0, 0) - T[0] * B(1, 0); |
583 |
2/2✓ Branch 0 taken 180 times.
✓ Branch 1 taken 120 times.
|
300 | t = ((s < 0.0) ? -s : s); |
584 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | assert(t == fabs(s)); |
585 | |||
586 |
6/12✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
|
300 | diff = t - (a[0] * Bf(1, 0) + a[1] * Bf(0, 0) + b[1] * Bf(2, 2) + |
587 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
|
300 | b[2] * Bf(2, 1)); |
588 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | if (diff > 0) { |
589 | ✗ | sinus2 = 1 - Bf(2, 0) * Bf(2, 0); | |
590 | ✗ | if (sinus2 > 1e-6) { | |
591 | ✗ | squaredLowerBoundDistance = diff * diff / sinus2; | |
592 | ✗ | if (squaredLowerBoundDistance > breakDistance2) { | |
593 | ✗ | return true; | |
594 | } | ||
595 | } | ||
596 | } | ||
597 | |||
598 | // A2 x B1 | ||
599 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[1] * B(0, 1) - T[0] * B(1, 1); |
600 |
2/2✓ Branch 0 taken 120 times.
✓ Branch 1 taken 180 times.
|
300 | t = ((s < 0.0) ? -s : s); |
601 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | assert(t == fabs(s)); |
602 | |||
603 |
6/12✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
|
300 | diff = t - (a[0] * Bf(1, 1) + a[1] * Bf(0, 1) + b[0] * Bf(2, 2) + |
604 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
|
300 | b[2] * Bf(2, 0)); |
605 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | if (diff > 0) { |
606 | ✗ | sinus2 = 1 - Bf(2, 1) * Bf(2, 1); | |
607 | ✗ | if (sinus2 > 1e-6) { | |
608 | ✗ | squaredLowerBoundDistance = diff * diff / sinus2; | |
609 | ✗ | if (squaredLowerBoundDistance > breakDistance2) { | |
610 | ✗ | return true; | |
611 | } | ||
612 | } | ||
613 | } | ||
614 | |||
615 | // A2 x B2 | ||
616 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[1] * B(0, 2) - T[0] * B(1, 2); |
617 |
2/2✓ Branch 0 taken 170 times.
✓ Branch 1 taken 130 times.
|
300 | t = ((s < 0.0) ? -s : s); |
618 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | assert(t == fabs(s)); |
619 | |||
620 |
6/12✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
|
300 | diff = t - (a[0] * Bf(1, 2) + a[1] * Bf(0, 2) + b[0] * Bf(2, 1) + |
621 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
|
300 | b[1] * Bf(2, 0)); |
622 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 290 times.
|
300 | if (diff > 0) { |
623 |
2/4✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
10 | sinus2 = 1 - Bf(2, 2) * Bf(2, 2); |
624 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (sinus2 > 1e-6) { |
625 | 10 | squaredLowerBoundDistance = diff * diff / sinus2; | |
626 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (squaredLowerBoundDistance > breakDistance2) { |
627 | 10 | return true; | |
628 | } | ||
629 | } | ||
630 | } | ||
631 | |||
632 | 290 | return false; | |
633 | } | ||
634 | |||
635 | // ------------------------ 3 -------------------------------------- | ||
636 | template <int ia, int ib, int ja = (ia + 1) % 3, int ka = (ia + 2) % 3, | ||
637 | int jb = (ib + 1) % 3, int kb = (ib + 2) % 3> | ||
638 | struct loop_case_1 { | ||
639 | 5460 | static inline bool run(const Matrix3s& B, const Vec3s& T, const Vec3s& a, | |
640 | const Vec3s& b, const Matrix3s& Bf, | ||
641 | const Scalar& breakDistance2, | ||
642 | Scalar& squaredLowerBoundDistance) { | ||
643 | 5460 | const Scalar s = T[ka] * B(ja, ib) - T[ja] * B(ka, ib); | |
644 | |||
645 | 5460 | const Scalar diff = fabs(s) - (a[ja] * Bf(ka, ib) + a[ka] * Bf(ja, ib) + | |
646 | 5460 | b[jb] * Bf(ia, kb) + b[kb] * Bf(ia, jb)); | |
647 | // We need to divide by the norm || Aia x Bib || | ||
648 | // As ||Aia|| = ||Bib|| = 1, (Aia | Bib)^2 = cosine^2 | ||
649 |
2/2✓ Branch 0 taken 20 times.
✓ Branch 1 taken 2710 times.
|
5460 | if (diff > 0) { |
650 | 40 | Scalar sinus2 = 1 - Bf(ia, ib) * Bf(ia, ib); | |
651 |
1/2✓ Branch 0 taken 20 times.
✗ Branch 1 not taken.
|
40 | if (sinus2 > 1e-6) { |
652 | 40 | squaredLowerBoundDistance = diff * diff / sinus2; | |
653 |
1/2✓ Branch 0 taken 20 times.
✗ Branch 1 not taken.
|
40 | if (squaredLowerBoundDistance > breakDistance2) { |
654 | 40 | return true; | |
655 | } | ||
656 | } | ||
657 | /* // or | ||
658 | Scalar sinus2 = 1 - Bf (ia,ib) * Bf (ia,ib); | ||
659 | squaredLowerBoundDistance = diff * diff; | ||
660 | if (squaredLowerBoundDistance > breakDistance2 * sinus2) { | ||
661 | squaredLowerBoundDistance /= sinus2; | ||
662 | return true; | ||
663 | } | ||
664 | // */ | ||
665 | } | ||
666 | 5420 | return false; | |
667 | } | ||
668 | }; | ||
669 | |||
670 | 1000 | bool withTemplateLoopUnrolling_1(const Matrix3s& B, const Vec3s& T, | |
671 | const Vec3s& a, const Vec3s& b, | ||
672 | const Scalar& breakDistance2, | ||
673 | Scalar& squaredLowerBoundDistance) { | ||
674 |
2/4✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
|
1000 | Matrix3s Bf(B.cwiseAbs()); |
675 | |||
676 | // Corner of b axis aligned bounding box the closest to the origin | ||
677 |
1/2✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
|
1000 | squaredLowerBoundDistance = _computeDistanceForCase1(T, a, b, Bf); |
678 |
2/2✓ Branch 0 taken 650 times.
✓ Branch 1 taken 350 times.
|
1000 | if (squaredLowerBoundDistance > breakDistance2) return true; |
679 | |||
680 |
1/2✓ Branch 1 taken 350 times.
✗ Branch 2 not taken.
|
350 | squaredLowerBoundDistance = _computeDistanceForCase2(B, T, a, b, Bf); |
681 |
2/2✓ Branch 0 taken 40 times.
✓ Branch 1 taken 310 times.
|
350 | if (squaredLowerBoundDistance > breakDistance2) return true; |
682 | |||
683 | // Ai x Bj | ||
684 |
2/4✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 310 times.
|
310 | if (loop_case_1<0, 0>::run(B, T, a, b, Bf, breakDistance2, |
685 | squaredLowerBoundDistance)) | ||
686 | ✗ | return true; | |
687 |
2/4✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 310 times.
|
310 | if (loop_case_1<0, 1>::run(B, T, a, b, Bf, breakDistance2, |
688 | squaredLowerBoundDistance)) | ||
689 | ✗ | return true; | |
690 |
3/4✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 300 times.
|
310 | if (loop_case_1<0, 2>::run(B, T, a, b, Bf, breakDistance2, |
691 | squaredLowerBoundDistance)) | ||
692 | 10 | return true; | |
693 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 300 times.
|
300 | if (loop_case_1<1, 0>::run(B, T, a, b, Bf, breakDistance2, |
694 | squaredLowerBoundDistance)) | ||
695 | ✗ | return true; | |
696 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 300 times.
|
300 | if (loop_case_1<1, 1>::run(B, T, a, b, Bf, breakDistance2, |
697 | squaredLowerBoundDistance)) | ||
698 | ✗ | return true; | |
699 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 300 times.
|
300 | if (loop_case_1<1, 2>::run(B, T, a, b, Bf, breakDistance2, |
700 | squaredLowerBoundDistance)) | ||
701 | ✗ | return true; | |
702 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 300 times.
|
300 | if (loop_case_1<2, 0>::run(B, T, a, b, Bf, breakDistance2, |
703 | squaredLowerBoundDistance)) | ||
704 | ✗ | return true; | |
705 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 300 times.
|
300 | if (loop_case_1<2, 1>::run(B, T, a, b, Bf, breakDistance2, |
706 | squaredLowerBoundDistance)) | ||
707 | ✗ | return true; | |
708 |
3/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 290 times.
|
300 | if (loop_case_1<2, 2>::run(B, T, a, b, Bf, breakDistance2, |
709 | squaredLowerBoundDistance)) | ||
710 | 10 | return true; | |
711 | |||
712 | 290 | return false; | |
713 | } | ||
714 | |||
715 | // ------------------------ 4 -------------------------------------- | ||
716 | |||
717 | template <int ib, int jb = (ib + 1) % 3, int kb = (ib + 2) % 3> | ||
718 | struct loop_case_2 { | ||
719 | 5460 | static inline bool run(int ia, int ja, int ka, const Matrix3s& B, | |
720 | const Vec3s& T, const Vec3s& a, const Vec3s& b, | ||
721 | const Matrix3s& Bf, const Scalar& breakDistance2, | ||
722 | Scalar& squaredLowerBoundDistance) { | ||
723 | 5460 | const Scalar s = T[ka] * B(ja, ib) - T[ja] * B(ka, ib); | |
724 | |||
725 | 5460 | const Scalar diff = fabs(s) - (a[ja] * Bf(ka, ib) + a[ka] * Bf(ja, ib) + | |
726 | 5460 | b[jb] * Bf(ia, kb) + b[kb] * Bf(ia, jb)); | |
727 | // We need to divide by the norm || Aia x Bib || | ||
728 | // As ||Aia|| = ||Bib|| = 1, (Aia | Bib)^2 = cosine^2 | ||
729 |
2/2✓ Branch 0 taken 20 times.
✓ Branch 1 taken 2710 times.
|
5460 | if (diff > 0) { |
730 | 40 | Scalar sinus2 = 1 - Bf(ia, ib) * Bf(ia, ib); | |
731 |
1/2✓ Branch 0 taken 20 times.
✗ Branch 1 not taken.
|
40 | if (sinus2 > 1e-6) { |
732 | 40 | squaredLowerBoundDistance = diff * diff / sinus2; | |
733 |
1/2✓ Branch 0 taken 20 times.
✗ Branch 1 not taken.
|
40 | if (squaredLowerBoundDistance > breakDistance2) { |
734 | 40 | return true; | |
735 | } | ||
736 | } | ||
737 | /* // or | ||
738 | Scalar sinus2 = 1 - Bf (ia,ib) * Bf (ia,ib); | ||
739 | squaredLowerBoundDistance = diff * diff; | ||
740 | if (squaredLowerBoundDistance > breakDistance2 * sinus2) { | ||
741 | squaredLowerBoundDistance /= sinus2; | ||
742 | return true; | ||
743 | } | ||
744 | // */ | ||
745 | } | ||
746 | 5420 | return false; | |
747 | } | ||
748 | }; | ||
749 | |||
750 | 1000 | bool withPartialTemplateLoopUnrolling_1(const Matrix3s& B, const Vec3s& T, | |
751 | const Vec3s& a, const Vec3s& b, | ||
752 | const Scalar& breakDistance2, | ||
753 | Scalar& squaredLowerBoundDistance) { | ||
754 |
2/4✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
|
1000 | Matrix3s Bf(B.cwiseAbs()); |
755 | |||
756 | // Corner of b axis aligned bounding box the closest to the origin | ||
757 |
1/2✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
|
1000 | squaredLowerBoundDistance = _computeDistanceForCase1(T, a, b, Bf); |
758 |
2/2✓ Branch 0 taken 650 times.
✓ Branch 1 taken 350 times.
|
1000 | if (squaredLowerBoundDistance > breakDistance2) return true; |
759 | |||
760 |
1/2✓ Branch 1 taken 350 times.
✗ Branch 2 not taken.
|
350 | squaredLowerBoundDistance = _computeDistanceForCase2(B, T, a, b, Bf); |
761 |
2/2✓ Branch 0 taken 40 times.
✓ Branch 1 taken 310 times.
|
350 | if (squaredLowerBoundDistance > breakDistance2) return true; |
762 | |||
763 | // Ai x Bj | ||
764 | 310 | int ja = 1, ka = 2; | |
765 |
2/2✓ Branch 0 taken 910 times.
✓ Branch 1 taken 290 times.
|
1200 | for (int ia = 0; ia < 3; ++ia) { |
766 |
2/4✓ Branch 1 taken 910 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 910 times.
|
910 | if (loop_case_2<0>::run(ia, ja, ka, B, T, a, b, Bf, breakDistance2, |
767 | squaredLowerBoundDistance)) | ||
768 | ✗ | return true; | |
769 |
2/4✓ Branch 1 taken 910 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 910 times.
|
910 | if (loop_case_2<1>::run(ia, ja, ka, B, T, a, b, Bf, breakDistance2, |
770 | squaredLowerBoundDistance)) | ||
771 | ✗ | return true; | |
772 |
3/4✓ Branch 1 taken 910 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 20 times.
✓ Branch 4 taken 890 times.
|
910 | if (loop_case_2<2>::run(ia, ja, ka, B, T, a, b, Bf, breakDistance2, |
773 | squaredLowerBoundDistance)) | ||
774 | 20 | return true; | |
775 | 890 | ja = ka; | |
776 | 890 | ka = ia; | |
777 | } | ||
778 | |||
779 | 290 | return false; | |
780 | } | ||
781 | |||
782 | // ------------------------ 5 -------------------------------------- | ||
783 | 1000 | bool originalWithLowerBound(const Matrix3s& B, const Vec3s& T, const Vec3s& a, | |
784 | const Vec3s& b, const Scalar& breakDistance2, | ||
785 | Scalar& squaredLowerBoundDistance) { | ||
786 | Scalar t, s; | ||
787 | Scalar diff; | ||
788 | |||
789 |
2/4✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
|
1000 | Matrix3s Bf(B.cwiseAbs()); |
790 | 1000 | squaredLowerBoundDistance = 0; | |
791 | |||
792 | // if any of these tests are one-sided, then the polyhedra are disjoint | ||
793 | |||
794 | // A1 x A2 = A0 | ||
795 |
5/8✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 520 times.
✓ Branch 4 taken 480 times.
✓ Branch 6 taken 520 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 480 times.
✗ Branch 10 not taken.
|
1000 | t = ((T[0] < 0.0) ? -T[0] : T[0]); |
796 | |||
797 |
3/6✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1000 times.
✗ Branch 8 not taken.
|
1000 | diff = t - (a[0] + Bf.row(0).dot(b)); |
798 |
2/2✓ Branch 0 taken 290 times.
✓ Branch 1 taken 710 times.
|
1000 | if (diff > 0) { |
799 | 290 | squaredLowerBoundDistance = diff * diff; | |
800 | } | ||
801 | |||
802 | // A2 x A0 = A1 | ||
803 |
5/8✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 480 times.
✓ Branch 4 taken 520 times.
✓ Branch 6 taken 480 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 520 times.
✗ Branch 10 not taken.
|
1000 | t = ((T[1] < 0.0) ? -T[1] : T[1]); |
804 | |||
805 |
3/6✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1000 times.
✗ Branch 8 not taken.
|
1000 | diff = t - (a[1] + Bf.row(1).dot(b)); |
806 |
2/2✓ Branch 0 taken 350 times.
✓ Branch 1 taken 650 times.
|
1000 | if (diff > 0) { |
807 | 350 | squaredLowerBoundDistance += diff * diff; | |
808 | } | ||
809 | |||
810 | // A0 x A1 = A2 | ||
811 |
5/8✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 500 times.
✓ Branch 4 taken 500 times.
✓ Branch 6 taken 500 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 500 times.
✗ Branch 10 not taken.
|
1000 | t = ((T[2] < 0.0) ? -T[2] : T[2]); |
812 | |||
813 |
3/6✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1000 times.
✗ Branch 8 not taken.
|
1000 | diff = t - (a[2] + Bf.row(2).dot(b)); |
814 |
2/2✓ Branch 0 taken 180 times.
✓ Branch 1 taken 820 times.
|
1000 | if (diff > 0) { |
815 | 180 | squaredLowerBoundDistance += diff * diff; | |
816 | } | ||
817 | |||
818 |
2/2✓ Branch 0 taken 650 times.
✓ Branch 1 taken 350 times.
|
1000 | if (squaredLowerBoundDistance > breakDistance2) return true; |
819 | |||
820 | 350 | squaredLowerBoundDistance = 0; | |
821 | |||
822 | // B1 x B2 = B0 | ||
823 |
2/4✓ Branch 1 taken 350 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 350 times.
✗ Branch 5 not taken.
|
350 | s = B.col(0).dot(T); |
824 |
2/2✓ Branch 0 taken 180 times.
✓ Branch 1 taken 170 times.
|
350 | t = ((s < 0.0) ? -s : s); |
825 | |||
826 |
3/6✓ Branch 1 taken 350 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 350 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 350 times.
✗ Branch 8 not taken.
|
350 | diff = t - (b[0] + Bf.col(0).dot(a)); |
827 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 350 times.
|
350 | if (diff > 0) { |
828 | ✗ | squaredLowerBoundDistance += diff * diff; | |
829 | } | ||
830 | |||
831 | // B2 x B0 = B1 | ||
832 |
2/4✓ Branch 1 taken 350 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 350 times.
✗ Branch 5 not taken.
|
350 | s = B.col(1).dot(T); |
833 |
2/2✓ Branch 0 taken 180 times.
✓ Branch 1 taken 170 times.
|
350 | t = ((s < 0.0) ? -s : s); |
834 | |||
835 |
3/6✓ Branch 1 taken 350 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 350 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 350 times.
✗ Branch 8 not taken.
|
350 | diff = t - (b[1] + Bf.col(1).dot(a)); |
836 |
2/2✓ Branch 0 taken 20 times.
✓ Branch 1 taken 330 times.
|
350 | if (diff > 0) { |
837 | 20 | squaredLowerBoundDistance += diff * diff; | |
838 | } | ||
839 | |||
840 | // B0 x B1 = B2 | ||
841 |
2/4✓ Branch 1 taken 350 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 350 times.
✗ Branch 5 not taken.
|
350 | s = B.col(2).dot(T); |
842 |
2/2✓ Branch 0 taken 220 times.
✓ Branch 1 taken 130 times.
|
350 | t = ((s < 0.0) ? -s : s); |
843 | |||
844 |
3/6✓ Branch 1 taken 350 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 350 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 350 times.
✗ Branch 8 not taken.
|
350 | diff = t - (b[2] + Bf.col(2).dot(a)); |
845 |
2/2✓ Branch 0 taken 20 times.
✓ Branch 1 taken 330 times.
|
350 | if (diff > 0) { |
846 | 20 | squaredLowerBoundDistance += diff * diff; | |
847 | } | ||
848 | |||
849 |
2/2✓ Branch 0 taken 40 times.
✓ Branch 1 taken 310 times.
|
350 | if (squaredLowerBoundDistance > breakDistance2) return true; |
850 | |||
851 | // A0 x B0 | ||
852 |
4/8✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
|
310 | s = T[2] * B(1, 0) - T[1] * B(2, 0); |
853 |
2/2✓ Branch 0 taken 180 times.
✓ Branch 1 taken 130 times.
|
310 | t = ((s < 0.0) ? -s : s); |
854 | |||
855 | Scalar sinus2; | ||
856 |
6/12✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 310 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 310 times.
✗ Branch 17 not taken.
|
310 | diff = t - (a[1] * Bf(2, 0) + a[2] * Bf(1, 0) + b[1] * Bf(0, 2) + |
857 |
2/4✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
|
310 | b[2] * Bf(0, 1)); |
858 | // We need to divide by the norm || A0 x B0 || | ||
859 | // As ||A0|| = ||B0|| = 1, | ||
860 | // 2 2 | ||
861 | // || A0 x B0 || + (A0 | B0) = 1 | ||
862 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 310 times.
|
310 | if (diff > 0) { |
863 | ✗ | sinus2 = 1 - Bf(0, 0) * Bf(0, 0); | |
864 | ✗ | if (sinus2 > 1e-6) { | |
865 | ✗ | squaredLowerBoundDistance = diff * diff / sinus2; | |
866 | ✗ | if (squaredLowerBoundDistance > breakDistance2) { | |
867 | ✗ | return true; | |
868 | } | ||
869 | } | ||
870 | } | ||
871 | |||
872 | // A0 x B1 | ||
873 |
4/8✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
|
310 | s = T[2] * B(1, 1) - T[1] * B(2, 1); |
874 |
2/2✓ Branch 0 taken 150 times.
✓ Branch 1 taken 160 times.
|
310 | t = ((s < 0.0) ? -s : s); |
875 | |||
876 |
6/12✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 310 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 310 times.
✗ Branch 17 not taken.
|
310 | diff = t - (a[1] * Bf(2, 1) + a[2] * Bf(1, 1) + b[0] * Bf(0, 2) + |
877 |
2/4✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
|
310 | b[2] * Bf(0, 0)); |
878 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 310 times.
|
310 | if (diff > 0) { |
879 | ✗ | sinus2 = 1 - Bf(0, 1) * Bf(0, 1); | |
880 | ✗ | if (sinus2 > 1e-6) { | |
881 | ✗ | squaredLowerBoundDistance = diff * diff / sinus2; | |
882 | ✗ | if (squaredLowerBoundDistance > breakDistance2) { | |
883 | ✗ | return true; | |
884 | } | ||
885 | } | ||
886 | } | ||
887 | |||
888 | // A0 x B2 | ||
889 |
4/8✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
|
310 | s = T[2] * B(1, 2) - T[1] * B(2, 2); |
890 |
2/2✓ Branch 0 taken 200 times.
✓ Branch 1 taken 110 times.
|
310 | t = ((s < 0.0) ? -s : s); |
891 | |||
892 |
6/12✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 310 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 310 times.
✗ Branch 17 not taken.
|
310 | diff = t - (a[1] * Bf(2, 2) + a[2] * Bf(1, 2) + b[0] * Bf(0, 1) + |
893 |
2/4✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
|
310 | b[1] * Bf(0, 0)); |
894 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 300 times.
|
310 | if (diff > 0) { |
895 |
2/4✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
10 | sinus2 = 1 - Bf(0, 2) * Bf(0, 2); |
896 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (sinus2 > 1e-6) { |
897 | 10 | squaredLowerBoundDistance = diff * diff / sinus2; | |
898 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (squaredLowerBoundDistance > breakDistance2) { |
899 | 10 | return true; | |
900 | } | ||
901 | } | ||
902 | } | ||
903 | |||
904 | // A1 x B0 | ||
905 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[0] * B(2, 0) - T[2] * B(0, 0); |
906 |
2/2✓ Branch 0 taken 150 times.
✓ Branch 1 taken 150 times.
|
300 | t = ((s < 0.0) ? -s : s); |
907 | |||
908 |
6/12✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
|
300 | diff = t - (a[0] * Bf(2, 0) + a[2] * Bf(0, 0) + b[1] * Bf(1, 2) + |
909 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
|
300 | b[2] * Bf(1, 1)); |
910 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | if (diff > 0) { |
911 | ✗ | sinus2 = 1 - Bf(1, 0) * Bf(1, 0); | |
912 | ✗ | if (sinus2 > 1e-6) { | |
913 | ✗ | squaredLowerBoundDistance = diff * diff / sinus2; | |
914 | ✗ | if (squaredLowerBoundDistance > breakDistance2) { | |
915 | ✗ | return true; | |
916 | } | ||
917 | } | ||
918 | } | ||
919 | |||
920 | // A1 x B1 | ||
921 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[0] * B(2, 1) - T[2] * B(0, 1); |
922 |
2/2✓ Branch 0 taken 190 times.
✓ Branch 1 taken 110 times.
|
300 | t = ((s < 0.0) ? -s : s); |
923 | |||
924 |
6/12✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
|
300 | diff = t - (a[0] * Bf(2, 1) + a[2] * Bf(0, 1) + b[0] * Bf(1, 2) + |
925 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
|
300 | b[2] * Bf(1, 0)); |
926 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | if (diff > 0) { |
927 | ✗ | sinus2 = 1 - Bf(1, 1) * Bf(1, 1); | |
928 | ✗ | if (sinus2 > 1e-6) { | |
929 | ✗ | squaredLowerBoundDistance = diff * diff / sinus2; | |
930 | ✗ | if (squaredLowerBoundDistance > breakDistance2) { | |
931 | ✗ | return true; | |
932 | } | ||
933 | } | ||
934 | } | ||
935 | |||
936 | // A1 x B2 | ||
937 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[0] * B(2, 2) - T[2] * B(0, 2); |
938 |
2/2✓ Branch 0 taken 120 times.
✓ Branch 1 taken 180 times.
|
300 | t = ((s < 0.0) ? -s : s); |
939 | |||
940 |
6/12✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
|
300 | diff = t - (a[0] * Bf(2, 2) + a[2] * Bf(0, 2) + b[0] * Bf(1, 1) + |
941 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
|
300 | b[1] * Bf(1, 0)); |
942 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | if (diff > 0) { |
943 | ✗ | sinus2 = 1 - Bf(1, 2) * Bf(1, 2); | |
944 | ✗ | if (sinus2 > 1e-6) { | |
945 | ✗ | squaredLowerBoundDistance = diff * diff / sinus2; | |
946 | ✗ | if (squaredLowerBoundDistance > breakDistance2) { | |
947 | ✗ | return true; | |
948 | } | ||
949 | } | ||
950 | } | ||
951 | |||
952 | // A2 x B0 | ||
953 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[1] * B(0, 0) - T[0] * B(1, 0); |
954 |
2/2✓ Branch 0 taken 180 times.
✓ Branch 1 taken 120 times.
|
300 | t = ((s < 0.0) ? -s : s); |
955 | |||
956 |
6/12✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
|
300 | diff = t - (a[0] * Bf(1, 0) + a[1] * Bf(0, 0) + b[1] * Bf(2, 2) + |
957 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
|
300 | b[2] * Bf(2, 1)); |
958 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | if (diff > 0) { |
959 | ✗ | sinus2 = 1 - Bf(2, 0) * Bf(2, 0); | |
960 | ✗ | if (sinus2 > 1e-6) { | |
961 | ✗ | squaredLowerBoundDistance = diff * diff / sinus2; | |
962 | ✗ | if (squaredLowerBoundDistance > breakDistance2) { | |
963 | ✗ | return true; | |
964 | } | ||
965 | } | ||
966 | } | ||
967 | |||
968 | // A2 x B1 | ||
969 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[1] * B(0, 1) - T[0] * B(1, 1); |
970 |
2/2✓ Branch 0 taken 120 times.
✓ Branch 1 taken 180 times.
|
300 | t = ((s < 0.0) ? -s : s); |
971 | |||
972 |
6/12✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
|
300 | diff = t - (a[0] * Bf(1, 1) + a[1] * Bf(0, 1) + b[0] * Bf(2, 2) + |
973 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
|
300 | b[2] * Bf(2, 0)); |
974 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 300 times.
|
300 | if (diff > 0) { |
975 | ✗ | sinus2 = 1 - Bf(2, 1) * Bf(2, 1); | |
976 | ✗ | if (sinus2 > 1e-6) { | |
977 | ✗ | squaredLowerBoundDistance = diff * diff / sinus2; | |
978 | ✗ | if (squaredLowerBoundDistance > breakDistance2) { | |
979 | ✗ | return true; | |
980 | } | ||
981 | } | ||
982 | } | ||
983 | |||
984 | // A2 x B2 | ||
985 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[1] * B(0, 2) - T[0] * B(1, 2); |
986 |
2/2✓ Branch 0 taken 170 times.
✓ Branch 1 taken 130 times.
|
300 | t = ((s < 0.0) ? -s : s); |
987 | |||
988 |
6/12✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
|
300 | diff = t - (a[0] * Bf(1, 2) + a[1] * Bf(0, 2) + b[0] * Bf(2, 1) + |
989 |
2/4✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
|
300 | b[1] * Bf(2, 0)); |
990 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 290 times.
|
300 | if (diff > 0) { |
991 |
2/4✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
10 | sinus2 = 1 - Bf(2, 2) * Bf(2, 2); |
992 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (sinus2 > 1e-6) { |
993 | 10 | squaredLowerBoundDistance = diff * diff / sinus2; | |
994 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (squaredLowerBoundDistance > breakDistance2) { |
995 | 10 | return true; | |
996 | } | ||
997 | } | ||
998 | } | ||
999 | |||
1000 | 290 | return false; | |
1001 | } | ||
1002 | |||
1003 | // ------------------------ 6 -------------------------------------- | ||
1004 | 1000 | bool originalWithNoLowerBound(const Matrix3s& B, const Vec3s& T, const Vec3s& a, | |
1005 | const Vec3s& b, const Scalar&, | ||
1006 | Scalar& squaredLowerBoundDistance) { | ||
1007 | Scalar t, s; | ||
1008 | 1000 | const Scalar reps = Scalar(1e-6); | |
1009 | |||
1010 | 1000 | squaredLowerBoundDistance = 0; | |
1011 | |||
1012 |
4/8✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1000 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1000 times.
✗ Branch 11 not taken.
|
1000 | Matrix3s Bf(B.array().abs() + reps); |
1013 | // Bf += reps; | ||
1014 | |||
1015 | // if any of these tests are one-sided, then the polyhedra are disjoint | ||
1016 | |||
1017 | // A1 x A2 = A0 | ||
1018 |
5/8✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 520 times.
✓ Branch 4 taken 480 times.
✓ Branch 6 taken 520 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 480 times.
✗ Branch 10 not taken.
|
1000 | t = ((T[0] < 0.0) ? -T[0] : T[0]); |
1019 | |||
1020 | // if(t > (a[0] + Bf.dotX(b))) | ||
1021 |
5/8✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1000 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 290 times.
✓ Branch 10 taken 710 times.
|
1000 | if (t > (a[0] + Bf.row(0).dot(b))) return true; |
1022 | |||
1023 | // B1 x B2 = B0 | ||
1024 | // s = B.transposeDotX(T); | ||
1025 |
2/4✓ Branch 1 taken 710 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 710 times.
✗ Branch 5 not taken.
|
710 | s = B.col(0).dot(T); |
1026 |
2/2✓ Branch 0 taken 410 times.
✓ Branch 1 taken 300 times.
|
710 | t = ((s < 0.0) ? -s : s); |
1027 | |||
1028 | // if(t > (b[0] + Bf.transposeDotX(a))) | ||
1029 |
5/8✓ Branch 1 taken 710 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 710 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 710 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 140 times.
✓ Branch 10 taken 570 times.
|
710 | if (t > (b[0] + Bf.col(0).dot(a))) return true; |
1030 | |||
1031 | // A2 x A0 = A1 | ||
1032 |
5/8✓ Branch 1 taken 570 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 290 times.
✓ Branch 4 taken 280 times.
✓ Branch 6 taken 290 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 280 times.
✗ Branch 10 not taken.
|
570 | t = ((T[1] < 0.0) ? -T[1] : T[1]); |
1033 | |||
1034 | // if(t > (a[1] + Bf.dotY(b))) | ||
1035 |
5/8✓ Branch 1 taken 570 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 570 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 570 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 160 times.
✓ Branch 10 taken 410 times.
|
570 | if (t > (a[1] + Bf.row(1).dot(b))) return true; |
1036 | |||
1037 | // A0 x A1 = A2 | ||
1038 |
5/8✓ Branch 1 taken 410 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 190 times.
✓ Branch 4 taken 220 times.
✓ Branch 6 taken 190 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 220 times.
✗ Branch 10 not taken.
|
410 | t = ((T[2] < 0.0) ? -T[2] : T[2]); |
1039 | |||
1040 | // if(t > (a[2] + Bf.dotZ(b))) | ||
1041 |
5/8✓ Branch 1 taken 410 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 410 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 410 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 60 times.
✓ Branch 10 taken 350 times.
|
410 | if (t > (a[2] + Bf.row(2).dot(b))) return true; |
1042 | |||
1043 | // B2 x B0 = B1 | ||
1044 | // s = B.transposeDotY(T); | ||
1045 |
2/4✓ Branch 1 taken 350 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 350 times.
✗ Branch 5 not taken.
|
350 | s = B.col(1).dot(T); |
1046 |
2/2✓ Branch 0 taken 180 times.
✓ Branch 1 taken 170 times.
|
350 | t = ((s < 0.0) ? -s : s); |
1047 | |||
1048 | // if(t > (b[1] + Bf.transposeDotY(a))) | ||
1049 |
5/8✓ Branch 1 taken 350 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 350 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 350 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 20 times.
✓ Branch 10 taken 330 times.
|
350 | if (t > (b[1] + Bf.col(1).dot(a))) return true; |
1050 | |||
1051 | // B0 x B1 = B2 | ||
1052 | // s = B.transposeDotZ(T); | ||
1053 |
2/4✓ Branch 1 taken 330 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 330 times.
✗ Branch 5 not taken.
|
330 | s = B.col(2).dot(T); |
1054 |
2/2✓ Branch 0 taken 210 times.
✓ Branch 1 taken 120 times.
|
330 | t = ((s < 0.0) ? -s : s); |
1055 | |||
1056 | // if(t > (b[2] + Bf.transposeDotZ(a))) | ||
1057 |
5/8✓ Branch 1 taken 330 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 330 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 330 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 20 times.
✓ Branch 10 taken 310 times.
|
330 | if (t > (b[2] + Bf.col(2).dot(a))) return true; |
1058 | |||
1059 | // A0 x B0 | ||
1060 |
4/8✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
|
310 | s = T[2] * B(1, 0) - T[1] * B(2, 0); |
1061 |
2/2✓ Branch 0 taken 180 times.
✓ Branch 1 taken 130 times.
|
310 | t = ((s < 0.0) ? -s : s); |
1062 | |||
1063 | 310 | if (t > | |
1064 |
9/18✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 310 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 310 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 310 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 310 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 310 times.
|
310 | (a[1] * Bf(2, 0) + a[2] * Bf(1, 0) + b[1] * Bf(0, 2) + b[2] * Bf(0, 1))) |
1065 | ✗ | return true; | |
1066 | |||
1067 | // A0 x B1 | ||
1068 |
4/8✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
|
310 | s = T[2] * B(1, 1) - T[1] * B(2, 1); |
1069 |
2/2✓ Branch 0 taken 150 times.
✓ Branch 1 taken 160 times.
|
310 | t = ((s < 0.0) ? -s : s); |
1070 | |||
1071 | 310 | if (t > | |
1072 |
9/18✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 310 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 310 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 310 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 310 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 310 times.
|
310 | (a[1] * Bf(2, 1) + a[2] * Bf(1, 1) + b[0] * Bf(0, 2) + b[2] * Bf(0, 0))) |
1073 | ✗ | return true; | |
1074 | |||
1075 | // A0 x B2 | ||
1076 |
4/8✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
|
310 | s = T[2] * B(1, 2) - T[1] * B(2, 2); |
1077 |
2/2✓ Branch 0 taken 200 times.
✓ Branch 1 taken 110 times.
|
310 | t = ((s < 0.0) ? -s : s); |
1078 | |||
1079 | 310 | if (t > | |
1080 |
10/18✓ Branch 1 taken 310 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 310 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 310 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 310 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 310 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 310 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 310 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 310 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 10 times.
✓ Branch 25 taken 300 times.
|
310 | (a[1] * Bf(2, 2) + a[2] * Bf(1, 2) + b[0] * Bf(0, 1) + b[1] * Bf(0, 0))) |
1081 | 10 | return true; | |
1082 | |||
1083 | // A1 x B0 | ||
1084 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[0] * B(2, 0) - T[2] * B(0, 0); |
1085 |
2/2✓ Branch 0 taken 150 times.
✓ Branch 1 taken 150 times.
|
300 | t = ((s < 0.0) ? -s : s); |
1086 | |||
1087 | 300 | if (t > | |
1088 |
9/18✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 300 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 300 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 300 times.
|
300 | (a[0] * Bf(2, 0) + a[2] * Bf(0, 0) + b[1] * Bf(1, 2) + b[2] * Bf(1, 1))) |
1089 | ✗ | return true; | |
1090 | |||
1091 | // A1 x B1 | ||
1092 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[0] * B(2, 1) - T[2] * B(0, 1); |
1093 |
2/2✓ Branch 0 taken 190 times.
✓ Branch 1 taken 110 times.
|
300 | t = ((s < 0.0) ? -s : s); |
1094 | |||
1095 | 300 | if (t > | |
1096 |
9/18✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 300 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 300 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 300 times.
|
300 | (a[0] * Bf(2, 1) + a[2] * Bf(0, 1) + b[0] * Bf(1, 2) + b[2] * Bf(1, 0))) |
1097 | ✗ | return true; | |
1098 | |||
1099 | // A1 x B2 | ||
1100 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[0] * B(2, 2) - T[2] * B(0, 2); |
1101 |
2/2✓ Branch 0 taken 120 times.
✓ Branch 1 taken 180 times.
|
300 | t = ((s < 0.0) ? -s : s); |
1102 | |||
1103 | 300 | if (t > | |
1104 |
9/18✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 300 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 300 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 300 times.
|
300 | (a[0] * Bf(2, 2) + a[2] * Bf(0, 2) + b[0] * Bf(1, 1) + b[1] * Bf(1, 0))) |
1105 | ✗ | return true; | |
1106 | |||
1107 | // A2 x B0 | ||
1108 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[1] * B(0, 0) - T[0] * B(1, 0); |
1109 |
2/2✓ Branch 0 taken 180 times.
✓ Branch 1 taken 120 times.
|
300 | t = ((s < 0.0) ? -s : s); |
1110 | |||
1111 | 300 | if (t > | |
1112 |
9/18✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 300 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 300 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 300 times.
|
300 | (a[0] * Bf(1, 0) + a[1] * Bf(0, 0) + b[1] * Bf(2, 2) + b[2] * Bf(2, 1))) |
1113 | ✗ | return true; | |
1114 | |||
1115 | // A2 x B1 | ||
1116 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[1] * B(0, 1) - T[0] * B(1, 1); |
1117 |
2/2✓ Branch 0 taken 120 times.
✓ Branch 1 taken 180 times.
|
300 | t = ((s < 0.0) ? -s : s); |
1118 | |||
1119 | 300 | if (t > | |
1120 |
9/18✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 300 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 300 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 300 times.
|
300 | (a[0] * Bf(1, 1) + a[1] * Bf(0, 1) + b[0] * Bf(2, 2) + b[2] * Bf(2, 0))) |
1121 | ✗ | return true; | |
1122 | |||
1123 | // A2 x B2 | ||
1124 |
4/8✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
|
300 | s = T[1] * B(0, 2) - T[0] * B(1, 2); |
1125 |
2/2✓ Branch 0 taken 170 times.
✓ Branch 1 taken 130 times.
|
300 | t = ((s < 0.0) ? -s : s); |
1126 | |||
1127 | 300 | if (t > | |
1128 |
10/18✓ Branch 1 taken 300 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 300 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 300 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 300 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 300 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 300 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 300 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 300 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 10 times.
✓ Branch 25 taken 290 times.
|
300 | (a[0] * Bf(1, 2) + a[1] * Bf(0, 2) + b[0] * Bf(2, 1) + b[1] * Bf(2, 0))) |
1129 | 10 | return true; | |
1130 | |||
1131 | 290 | return false; | |
1132 | } | ||
1133 | } // namespace obbDisjoint_impls | ||
1134 | |||
1135 | struct BenchmarkResult { | ||
1136 | /// The test ID: | ||
1137 | /// - 0-10 identifies a separating axes. | ||
1138 | /// - 11 means no separatins axes could be found. (distance should be <= 0) | ||
1139 | int ifId; | ||
1140 | Scalar distance; | ||
1141 | Scalar squaredLowerBoundDistance; | ||
1142 | duration_type duration[NB_METHODS]; | ||
1143 | bool failure; | ||
1144 | |||
1145 | ✗ | static std::ostream& headers(std::ostream& os) { | |
1146 | ✗ | const std::string unit = " (us)"; | |
1147 | os << "separating axis" << sep << "distance lower bound" << sep | ||
1148 | << "distance" << sep << "failure" << sep << "Runtime Loop" << unit << sep | ||
1149 | << "Manual Loop Unrolling 1" << unit << sep << "Manual Loop Unrolling 2" | ||
1150 | << unit << sep << "Template Unrolling" << unit << sep | ||
1151 | << "Partial Template Unrolling" << unit << sep << "Original (LowerBound)" | ||
1152 | ✗ | << unit << sep << "Original (NoLowerBound)" << unit; | |
1153 | ✗ | return os; | |
1154 | } | ||
1155 | |||
1156 | ✗ | std::ostream& print(std::ostream& os) const { | |
1157 | ✗ | os << ifId << sep << std::sqrt(squaredLowerBoundDistance) << sep << distance | |
1158 | ✗ | << sep << failure; | |
1159 | ✗ | for (int i = 0; i < NB_METHODS; ++i) | |
1160 | ✗ | os << sep | |
1161 | ✗ | << static_cast<double>( | |
1162 | ✗ | std::chrono::duration_cast<std::chrono::nanoseconds>( | |
1163 | ✗ | duration[i]) | |
1164 | ✗ | .count()) * | |
1165 | ✗ | 1e-3; | |
1166 | ✗ | return os; | |
1167 | } | ||
1168 | }; | ||
1169 | |||
1170 | ✗ | std::ostream& operator<<(std::ostream& os, const BenchmarkResult& br) { | |
1171 | ✗ | return br.print(os); | |
1172 | } | ||
1173 | |||
1174 | 100 | BenchmarkResult benchmark_obb_case(const Matrix3s& B, const Vec3s& T, | |
1175 | const Vec3s& a, const Vec3s& b, | ||
1176 | const CollisionRequest& request, | ||
1177 | std::size_t N) { | ||
1178 | 100 | const Scalar breakDistance(request.break_distance + request.security_margin); | |
1179 | 100 | const Scalar breakDistance2 = breakDistance * breakDistance; | |
1180 | |||
1181 | BenchmarkResult result; | ||
1182 | // First determine which axis provide the answer | ||
1183 |
1/2✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
|
100 | result.ifId = obbDisjoint_impls::separatingAxisId( |
1184 | B, T, a, b, breakDistance2, result.squaredLowerBoundDistance); | ||
1185 |
1/2✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
|
100 | bool disjoint = obbDisjoint_impls::distance(B, T, a, b, result.distance); |
1186 |
2/4✓ Branch 0 taken 100 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
|
100 | assert(0 <= result.ifId && result.ifId <= 11); |
1187 | |||
1188 | // Sanity check | ||
1189 | 100 | result.failure = true; | |
1190 | 100 | bool overlap = (result.ifId == 11); | |
1191 | 100 | Scalar dist_thr = request.break_distance + request.security_margin; | |
1192 |
3/4✓ Branch 0 taken 71 times.
✓ Branch 1 taken 29 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 71 times.
|
100 | if (!overlap && result.distance <= 0) { |
1193 | ✗ | std::cerr << "Failure: negative distance for disjoint OBBs."; | |
1194 |
3/4✓ Branch 0 taken 71 times.
✓ Branch 1 taken 29 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 71 times.
|
100 | } else if (!overlap && result.squaredLowerBoundDistance < 0) { |
1195 | ✗ | std::cerr << "Failure: negative distance lower bound."; | |
1196 |
3/4✓ Branch 0 taken 71 times.
✓ Branch 1 taken 29 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 100 times.
|
171 | } else if (!overlap && eps < std::sqrt(result.squaredLowerBoundDistance) - |
1197 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 71 times.
|
71 | result.distance) { |
1198 | ✗ | std::cerr << "Failure: distance is inferior to its lower bound (diff = " | |
1199 | ✗ | << std::sqrt(result.squaredLowerBoundDistance) - result.distance | |
1200 | ✗ | << ")."; | |
1201 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
100 | } else if (overlap != !disjoint && result.distance >= dist_thr - eps) { |
1202 | ✗ | std::cerr << "Failure: overlapping test and distance query mismatch."; | |
1203 |
3/4✓ Branch 0 taken 29 times.
✓ Branch 1 taken 71 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 29 times.
|
100 | } else if (overlap && result.distance >= dist_thr - eps) { |
1204 | ✗ | std::cerr << "Failure: positive distance for overlapping OBBs."; | |
1205 | } else { | ||
1206 | 100 | result.failure = false; | |
1207 | } | ||
1208 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 100 times.
|
100 | if (result.failure) { |
1209 | ✗ | std::cerr << "\nR = " << Quats(B).coeffs().transpose().format(py_fmt) | |
1210 | ✗ | << "\nT = " << T.transpose().format(py_fmt) | |
1211 | ✗ | << "\na = " << a.transpose().format(py_fmt) | |
1212 | ✗ | << "\nb = " << b.transpose().format(py_fmt) | |
1213 | ✗ | << "\nresult = " << result << '\n' | |
1214 | ✗ | << std::endl; | |
1215 | } | ||
1216 | |||
1217 | // Compute time | ||
1218 | Scalar tmp; | ||
1219 | 100 | clock_type::time_point start, end; | |
1220 | |||
1221 | // ------------------------ 0 -------------------------------------- | ||
1222 | 100 | start = clock_type::now(); | |
1223 |
2/2✓ Branch 0 taken 1000 times.
✓ Branch 1 taken 100 times.
|
1100 | for (std::size_t i = 0; i < N; ++i) |
1224 |
1/2✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
|
1000 | obbDisjoint_impls::withRuntimeLoop(B, T, a, b, breakDistance2, tmp); |
1225 | 100 | end = clock_type::now(); | |
1226 |
3/6✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 100 times.
✗ Branch 8 not taken.
|
100 | result.duration[0] = (end - start) / N; |
1227 | |||
1228 | // ------------------------ 1 -------------------------------------- | ||
1229 | 100 | start = clock_type::now(); | |
1230 |
2/2✓ Branch 0 taken 1000 times.
✓ Branch 1 taken 100 times.
|
1100 | for (std::size_t i = 0; i < N; ++i) |
1231 |
1/2✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
|
1000 | obbDisjoint_impls::withManualLoopUnrolling_1(B, T, a, b, breakDistance2, |
1232 | tmp); | ||
1233 | 100 | end = clock_type::now(); | |
1234 |
3/6✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 100 times.
✗ Branch 8 not taken.
|
100 | result.duration[1] = (end - start) / N; |
1235 | |||
1236 | // ------------------------ 2 -------------------------------------- | ||
1237 | 100 | start = clock_type::now(); | |
1238 |
2/2✓ Branch 0 taken 1000 times.
✓ Branch 1 taken 100 times.
|
1100 | for (std::size_t i = 0; i < N; ++i) |
1239 |
1/2✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
|
1000 | obbDisjoint_impls::withManualLoopUnrolling_2(B, T, a, b, breakDistance2, |
1240 | tmp); | ||
1241 | 100 | end = clock_type::now(); | |
1242 |
3/6✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 100 times.
✗ Branch 8 not taken.
|
100 | result.duration[2] = (end - start) / N; |
1243 | |||
1244 | // ------------------------ 3 -------------------------------------- | ||
1245 | 100 | start = clock_type::now(); | |
1246 |
2/2✓ Branch 0 taken 1000 times.
✓ Branch 1 taken 100 times.
|
1100 | for (std::size_t i = 0; i < N; ++i) |
1247 |
1/2✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
|
1000 | obbDisjoint_impls::withTemplateLoopUnrolling_1(B, T, a, b, breakDistance2, |
1248 | tmp); | ||
1249 | 100 | end = clock_type::now(); | |
1250 |
3/6✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 100 times.
✗ Branch 8 not taken.
|
100 | result.duration[3] = (end - start) / N; |
1251 | |||
1252 | // ------------------------ 4 -------------------------------------- | ||
1253 | 100 | start = clock_type::now(); | |
1254 |
2/2✓ Branch 0 taken 1000 times.
✓ Branch 1 taken 100 times.
|
1100 | for (std::size_t i = 0; i < N; ++i) |
1255 |
1/2✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
|
1000 | obbDisjoint_impls::withPartialTemplateLoopUnrolling_1(B, T, a, b, |
1256 | breakDistance2, tmp); | ||
1257 | 100 | end = clock_type::now(); | |
1258 |
3/6✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 100 times.
✗ Branch 8 not taken.
|
100 | result.duration[4] = (end - start) / N; |
1259 | |||
1260 | // ------------------------ 5 -------------------------------------- | ||
1261 | 100 | start = clock_type::now(); | |
1262 |
2/2✓ Branch 0 taken 1000 times.
✓ Branch 1 taken 100 times.
|
1100 | for (std::size_t i = 0; i < N; ++i) |
1263 |
1/2✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
|
1000 | obbDisjoint_impls::originalWithLowerBound(B, T, a, b, breakDistance2, tmp); |
1264 | 100 | end = clock_type::now(); | |
1265 |
3/6✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 100 times.
✗ Branch 8 not taken.
|
100 | result.duration[5] = (end - start) / N; |
1266 | |||
1267 | // ------------------------ 6 -------------------------------------- | ||
1268 | 100 | start = clock_type::now(); | |
1269 | // The 2 last arguments are unused. | ||
1270 |
2/2✓ Branch 0 taken 1000 times.
✓ Branch 1 taken 100 times.
|
1100 | for (std::size_t i = 0; i < N; ++i) |
1271 |
1/2✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
|
1000 | obbDisjoint_impls::originalWithNoLowerBound(B, T, a, b, breakDistance2, |
1272 | tmp); | ||
1273 | 100 | end = clock_type::now(); | |
1274 |
3/6✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 100 times.
✗ Branch 8 not taken.
|
100 | result.duration[6] = (end - start) / N; |
1275 | |||
1276 | 200 | return result; | |
1277 | } | ||
1278 | |||
1279 | 1 | std::size_t obb_overlap_and_lower_bound_distance(std::ostream* output) { | |
1280 | 1 | std::size_t nbFailure = 0; | |
1281 | |||
1282 | // Create two OBBs axis | ||
1283 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | Vec3s a, b; |
1284 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | Matrix3s B; |
1285 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | Vec3s T; |
1286 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | CollisionRequest request; |
1287 | |||
1288 | #ifndef NDEBUG // if debug mode | ||
1289 | static const size_t nbRandomOBB = 10; | ||
1290 | static const size_t nbTransformPerOBB = 10; | ||
1291 | static const size_t nbRunForTimeMeas = 10; | ||
1292 | #else | ||
1293 | static const size_t nbRandomOBB = 100; | ||
1294 | static const size_t nbTransformPerOBB = 100; | ||
1295 | static const size_t nbRunForTimeMeas = 1000; | ||
1296 | #endif | ||
1297 | static const Scalar extentNorm = 1.; | ||
1298 | |||
1299 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
1 | if (output != NULL) *output << BenchmarkResult::headers << '\n'; |
1300 | |||
1301 | BenchmarkResult result; | ||
1302 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 1 times.
|
11 | for (std::size_t iobb = 0; iobb < nbRandomOBB; ++iobb) { |
1303 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | randomOBBs(a, b, extentNorm); |
1304 |
2/2✓ Branch 0 taken 100 times.
✓ Branch 1 taken 10 times.
|
110 | for (std::size_t itf = 0; itf < nbTransformPerOBB; ++itf) { |
1305 |
1/2✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
|
100 | randomTransform(B, T, a, b, extentNorm); |
1306 |
1/2✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
|
100 | result = benchmark_obb_case(B, T, a, b, request, nbRunForTimeMeas); |
1307 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 100 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
100 | if (output != NULL) *output << result << '\n'; |
1308 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 100 times.
|
100 | if (result.failure) nbFailure++; |
1309 | } | ||
1310 | } | ||
1311 | 1 | return nbFailure; | |
1312 | } | ||
1313 | |||
1314 | 1 | int main(int argc, char** argv) { | |
1315 | 1 | std::ostream* output = NULL; | |
1316 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1 | if (argc > 1 && strcmp(argv[1], "--generate-output") == 0) { |
1317 | ✗ | output = &std::cout; | |
1318 | } | ||
1319 | |||
1320 | std::cout << "The benchmark real time measurements may be noisy and " | ||
1321 | "will incur extra overhead." | ||
1322 | "\nUse the following commands to turn ON:" | ||
1323 | "\n\tsudo cpufreq-set --governor performance" | ||
1324 | "\nor OFF:" | ||
1325 | "\n\tsudo cpufreq-set --governor powersave" | ||
1326 | 1 | "\n"; | |
1327 | |||
1328 | 1 | std::size_t nbFailure = obb_overlap_and_lower_bound_distance(output); | |
1329 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if (nbFailure > INT_MAX) return INT_MAX; |
1330 | 1 | return (int)nbFailure; | |
1331 | } | ||
1332 |