| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /* | ||
| 2 | * Software License Agreement (BSD License) | ||
| 3 | * | ||
| 4 | * Copyright (c) 2011-2014, Willow Garage, Inc. | ||
| 5 | * Copyright (c) 2014-2015, Open Source Robotics Foundation | ||
| 6 | * All rights reserved. | ||
| 7 | * | ||
| 8 | * Redistribution and use in source and binary forms, with or without | ||
| 9 | * modification, are permitted provided that the following conditions | ||
| 10 | * are met: | ||
| 11 | * | ||
| 12 | * * Redistributions of source code must retain the above copyright | ||
| 13 | * notice, this list of conditions and the following disclaimer. | ||
| 14 | * * Redistributions in binary form must reproduce the above | ||
| 15 | * copyright notice, this list of conditions and the following | ||
| 16 | * disclaimer in the documentation and/or other materials provided | ||
| 17 | * with the distribution. | ||
| 18 | * * Neither the name of Open Source Robotics Foundation nor the names of its | ||
| 19 | * contributors may be used to endorse or promote products derived | ||
| 20 | * from this software without specific prior written permission. | ||
| 21 | * | ||
| 22 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 23 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 24 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 25 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 26 | * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 27 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 28 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 29 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 30 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 31 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 32 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 33 | * POSSIBILITY OF SUCH DAMAGE. | ||
| 34 | */ | ||
| 35 | |||
| 36 | /** \author Jia Pan, Florent Lamiraux */ | ||
| 37 | |||
| 38 | #include "coal/BV/OBB.h" | ||
| 39 | #include "coal/BVH/BVH_utility.h" | ||
| 40 | #include "coal/math/transform.h" | ||
| 41 | #include "coal/collision_data.h" | ||
| 42 | #include "coal/internal/tools.h" | ||
| 43 | |||
| 44 | #include <iostream> | ||
| 45 | #include <limits> | ||
| 46 | |||
| 47 | namespace coal { | ||
| 48 | |||
| 49 | /// @brief Compute the 8 vertices of a OBB | ||
| 50 | 39222 | inline void computeVertices(const OBB& b, Vec3s vertices[8]) { | |
| 51 |
3/6✓ Branch 1 taken 39222 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39222 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39222 times.
✗ Branch 8 not taken.
|
39222 | Matrix3s extAxes(b.axes * b.extent.asDiagonal()); |
| 52 |
5/10✓ Branch 1 taken 39222 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39222 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39222 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 39222 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 39222 times.
✗ Branch 14 not taken.
|
39222 | vertices[0].noalias() = b.To + extAxes * Vec3s(-1, -1, -1); |
| 53 |
5/10✓ Branch 1 taken 39222 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39222 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39222 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 39222 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 39222 times.
✗ Branch 14 not taken.
|
39222 | vertices[1].noalias() = b.To + extAxes * Vec3s(1, -1, -1); |
| 54 |
5/10✓ Branch 1 taken 39222 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39222 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39222 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 39222 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 39222 times.
✗ Branch 14 not taken.
|
39222 | vertices[2].noalias() = b.To + extAxes * Vec3s(1, 1, -1); |
| 55 |
5/10✓ Branch 1 taken 39222 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39222 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39222 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 39222 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 39222 times.
✗ Branch 14 not taken.
|
39222 | vertices[3].noalias() = b.To + extAxes * Vec3s(-1, 1, -1); |
| 56 |
5/10✓ Branch 1 taken 39222 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39222 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39222 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 39222 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 39222 times.
✗ Branch 14 not taken.
|
39222 | vertices[4].noalias() = b.To + extAxes * Vec3s(-1, -1, 1); |
| 57 |
5/10✓ Branch 1 taken 39222 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39222 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39222 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 39222 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 39222 times.
✗ Branch 14 not taken.
|
39222 | vertices[5].noalias() = b.To + extAxes * Vec3s(1, -1, 1); |
| 58 |
5/10✓ Branch 1 taken 39222 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39222 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39222 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 39222 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 39222 times.
✗ Branch 14 not taken.
|
39222 | vertices[6].noalias() = b.To + extAxes * Vec3s(1, 1, 1); |
| 59 |
5/10✓ Branch 1 taken 39222 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39222 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39222 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 39222 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 39222 times.
✗ Branch 14 not taken.
|
39222 | vertices[7].noalias() = b.To + extAxes * Vec3s(-1, 1, 1); |
| 60 | 39222 | } | |
| 61 | |||
| 62 | /// @brief OBB merge method when the centers of two smaller OBB are far away | ||
| 63 | 21 | inline OBB merge_largedist(const OBB& b1, const OBB& b2) { | |
| 64 |
1/2✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
|
21 | OBB b; |
| 65 |
3/4✓ Branch 1 taken 336 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 336 times.
✓ Branch 4 taken 21 times.
|
357 | Vec3s vertex[16]; |
| 66 |
1/2✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
|
21 | computeVertices(b1, vertex); |
| 67 |
1/2✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
|
21 | computeVertices(b2, vertex + 8); |
| 68 |
1/2✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
|
21 | Matrix3s M; |
| 69 |
3/4✓ Branch 1 taken 63 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 63 times.
✓ Branch 4 taken 21 times.
|
84 | Vec3s E[3]; |
| 70 | 21 | Scalar s[3] = {0, 0, 0}; | |
| 71 | |||
| 72 | // obb axes | ||
| 73 |
5/10✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 21 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 21 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 21 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 21 times.
✗ Branch 14 not taken.
|
21 | b.axes.col(0).noalias() = (b1.To - b2.To).normalized(); |
| 74 | |||
| 75 |
3/4✓ Branch 1 taken 336 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 336 times.
✓ Branch 4 taken 21 times.
|
357 | Vec3s vertex_proj[16]; |
| 76 |
2/2✓ Branch 0 taken 336 times.
✓ Branch 1 taken 21 times.
|
357 | for (int i = 0; i < 16; ++i) |
| 77 |
1/2✓ Branch 1 taken 336 times.
✗ Branch 2 not taken.
|
336 | vertex_proj[i].noalias() = |
| 78 |
6/12✓ Branch 1 taken 336 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 336 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 336 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 336 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 336 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 336 times.
✗ Branch 17 not taken.
|
672 | vertex[i] - b.axes.col(0) * vertex[i].dot(b.axes.col(0)); |
| 79 | |||
| 80 |
1/2✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
|
21 | getCovariance(vertex_proj, NULL, NULL, NULL, 16, M); |
| 81 |
1/2✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
|
21 | eigen(M, s, E); |
| 82 | |||
| 83 | int min, mid, max; | ||
| 84 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 18 times.
|
21 | if (s[0] > s[1]) { |
| 85 | 3 | max = 0; | |
| 86 | 3 | min = 1; | |
| 87 | } else { | ||
| 88 | 18 | min = 0; | |
| 89 | 18 | max = 1; | |
| 90 | } | ||
| 91 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 12 times.
|
21 | if (s[2] < s[min]) { |
| 92 | 9 | mid = min; | |
| 93 | 9 | min = 2; | |
| 94 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
|
12 | } else if (s[2] > s[max]) { |
| 95 | 6 | mid = max; | |
| 96 | 6 | max = 2; | |
| 97 | } else { | ||
| 98 | 6 | mid = 2; | |
| 99 | } | ||
| 100 | |||
| 101 |
7/14✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 21 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 21 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 21 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 21 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 21 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 21 times.
✗ Branch 20 not taken.
|
21 | b.axes.col(1) << E[0][max], E[1][max], E[2][max]; |
| 102 |
7/14✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 21 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 21 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 21 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 21 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 21 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 21 times.
✗ Branch 20 not taken.
|
21 | b.axes.col(2) << E[0][mid], E[1][mid], E[2][mid]; |
| 103 | |||
| 104 | // set obb centers and extensions | ||
| 105 |
2/4✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 21 times.
✗ Branch 5 not taken.
|
21 | Vec3s center, extent; |
| 106 |
1/2✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
|
21 | getExtentAndCenter(vertex, NULL, NULL, NULL, 16, b.axes, center, extent); |
| 107 | |||
| 108 |
2/4✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 21 times.
✗ Branch 5 not taken.
|
21 | b.To.noalias() = center; |
| 109 |
2/4✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 21 times.
✗ Branch 5 not taken.
|
21 | b.extent.noalias() = extent; |
| 110 | |||
| 111 | 42 | return b; | |
| 112 | } | ||
| 113 | |||
| 114 | /// @brief OBB merge method when the centers of two smaller OBB are close | ||
| 115 | 19590 | inline OBB merge_smalldist(const OBB& b1, const OBB& b2) { | |
| 116 |
1/2✓ Branch 1 taken 19590 times.
✗ Branch 2 not taken.
|
19590 | OBB b; |
| 117 |
3/6✓ Branch 1 taken 19590 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 19590 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 19590 times.
✗ Branch 8 not taken.
|
19590 | b.To = (b1.To + b2.To) * 0.5; |
| 118 |
2/4✓ Branch 1 taken 19590 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 19590 times.
✗ Branch 5 not taken.
|
19590 | Quats q0(b1.axes), q1(b2.axes); |
| 119 |
4/6✓ Branch 1 taken 19590 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5466 times.
✓ Branch 4 taken 14124 times.
✓ Branch 7 taken 5466 times.
✗ Branch 8 not taken.
|
19590 | if (q0.dot(q1) < 0) q1.coeffs() *= -1; |
| 120 | |||
| 121 |
3/6✓ Branch 3 taken 19590 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 19590 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 19590 times.
✗ Branch 10 not taken.
|
19590 | Quats q((q0.coeffs() + q1.coeffs()).normalized()); |
| 122 |
1/2✓ Branch 1 taken 19590 times.
✗ Branch 2 not taken.
|
19590 | b.axes = q.toRotationMatrix(); |
| 123 | |||
| 124 |
4/6✓ Branch 1 taken 156720 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 156720 times.
✓ Branch 4 taken 19590 times.
✓ Branch 6 taken 19590 times.
✗ Branch 7 not taken.
|
176310 | Vec3s vertex[8], diff; |
| 125 | 19590 | Scalar real_max = (std::numeric_limits<Scalar>::max)(); | |
| 126 |
1/2✓ Branch 1 taken 19590 times.
✗ Branch 2 not taken.
|
19590 | Vec3s pmin(real_max, real_max, real_max); |
| 127 |
1/2✓ Branch 1 taken 19590 times.
✗ Branch 2 not taken.
|
19590 | Vec3s pmax(-real_max, -real_max, -real_max); |
| 128 | |||
| 129 |
1/2✓ Branch 1 taken 19590 times.
✗ Branch 2 not taken.
|
19590 | computeVertices(b1, vertex); |
| 130 |
2/2✓ Branch 0 taken 156720 times.
✓ Branch 1 taken 19590 times.
|
176310 | for (int i = 0; i < 8; ++i) { |
| 131 |
2/4✓ Branch 1 taken 156720 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 156720 times.
✗ Branch 5 not taken.
|
156720 | diff = vertex[i] - b.To; |
| 132 |
2/2✓ Branch 0 taken 470160 times.
✓ Branch 1 taken 156720 times.
|
626880 | for (int j = 0; j < 3; ++j) { |
| 133 |
2/4✓ Branch 1 taken 470160 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 470160 times.
✗ Branch 5 not taken.
|
470160 | Scalar dot = diff.dot(b.axes.col(j)); |
| 134 |
3/4✓ Branch 1 taken 470160 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 175926 times.
✓ Branch 4 taken 294234 times.
|
470160 | if (dot > pmax[j]) |
| 135 |
1/2✓ Branch 1 taken 175926 times.
✗ Branch 2 not taken.
|
175926 | pmax[j] = dot; |
| 136 |
3/4✓ Branch 1 taken 294234 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 114381 times.
✓ Branch 4 taken 179853 times.
|
294234 | else if (dot < pmin[j]) |
| 137 |
1/2✓ Branch 1 taken 114381 times.
✗ Branch 2 not taken.
|
114381 | pmin[j] = dot; |
| 138 | } | ||
| 139 | } | ||
| 140 | |||
| 141 |
1/2✓ Branch 1 taken 19590 times.
✗ Branch 2 not taken.
|
19590 | computeVertices(b2, vertex); |
| 142 |
2/2✓ Branch 0 taken 156720 times.
✓ Branch 1 taken 19590 times.
|
176310 | for (int i = 0; i < 8; ++i) { |
| 143 |
2/4✓ Branch 1 taken 156720 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 156720 times.
✗ Branch 5 not taken.
|
156720 | diff = vertex[i] - b.To; |
| 144 |
2/2✓ Branch 0 taken 470160 times.
✓ Branch 1 taken 156720 times.
|
626880 | for (int j = 0; j < 3; ++j) { |
| 145 |
2/4✓ Branch 1 taken 470160 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 470160 times.
✗ Branch 5 not taken.
|
470160 | Scalar dot = diff.dot(b.axes.col(j)); |
| 146 |
3/4✓ Branch 1 taken 470160 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 55653 times.
✓ Branch 4 taken 414507 times.
|
470160 | if (dot > pmax[j]) |
| 147 |
1/2✓ Branch 1 taken 55653 times.
✗ Branch 2 not taken.
|
55653 | pmax[j] = dot; |
| 148 |
3/4✓ Branch 1 taken 414507 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 52290 times.
✓ Branch 4 taken 362217 times.
|
414507 | else if (dot < pmin[j]) |
| 149 |
1/2✓ Branch 1 taken 52290 times.
✗ Branch 2 not taken.
|
52290 | pmin[j] = dot; |
| 150 | } | ||
| 151 | } | ||
| 152 | |||
| 153 |
2/2✓ Branch 0 taken 58770 times.
✓ Branch 1 taken 19590 times.
|
78360 | for (int j = 0; j < 3; ++j) { |
| 154 |
6/12✓ Branch 1 taken 58770 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 58770 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 58770 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 58770 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 58770 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 58770 times.
✗ Branch 17 not taken.
|
58770 | b.To.noalias() += (b.axes.col(j) * (0.5 * (pmax[j] + pmin[j]))); |
| 155 |
3/6✓ Branch 1 taken 58770 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 58770 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 58770 times.
✗ Branch 8 not taken.
|
58770 | b.extent[j] = Scalar(0.5) * (pmax[j] - pmin[j]); |
| 156 | } | ||
| 157 | |||
| 158 | 39180 | return b; | |
| 159 | } | ||
| 160 | |||
| 161 | 6000 | bool obbDisjoint(const Matrix3s& B, const Vec3s& T, const Vec3s& a, | |
| 162 | const Vec3s& b) { | ||
| 163 | Scalar t, s; | ||
| 164 | 6000 | const Scalar reps = Scalar(1e-6); | |
| 165 | |||
| 166 |
4/8✓ Branch 1 taken 6000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6000 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6000 times.
✗ Branch 11 not taken.
|
6000 | Matrix3s Bf(B.array().abs() + reps); |
| 167 | // Bf += reps; | ||
| 168 | |||
| 169 | // if any of these tests are one-sided, then the polyhedra are disjoint | ||
| 170 | |||
| 171 | // A1 x A2 = A0 | ||
| 172 |
5/8✓ Branch 1 taken 6000 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1392 times.
✓ Branch 4 taken 4608 times.
✓ Branch 6 taken 1392 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 4608 times.
✗ Branch 10 not taken.
|
6000 | t = ((T[0] < 0.0) ? -T[0] : T[0]); |
| 173 | |||
| 174 | // if(t > (a[0] + Bf.dotX(b))) | ||
| 175 |
5/8✓ Branch 1 taken 6000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6000 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 469 times.
✓ Branch 10 taken 5531 times.
|
6000 | if (t > (a[0] + Bf.row(0).dot(b))) return true; |
| 176 | |||
| 177 | // B1 x B2 = B0 | ||
| 178 | // s = B.transposeDotX(T); | ||
| 179 |
2/4✓ Branch 1 taken 5531 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5531 times.
✗ Branch 5 not taken.
|
5531 | s = B.col(0).dot(T); |
| 180 |
2/2✓ Branch 0 taken 2397 times.
✓ Branch 1 taken 3134 times.
|
5531 | t = ((s < 0.0) ? -s : s); |
| 181 | |||
| 182 | // if(t > (b[0] + Bf.transposeDotX(a))) | ||
| 183 |
5/8✓ Branch 1 taken 5531 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5531 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5531 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 564 times.
✓ Branch 10 taken 4967 times.
|
5531 | if (t > (b[0] + Bf.col(0).dot(a))) return true; |
| 184 | |||
| 185 | // A2 x A0 = A1 | ||
| 186 |
5/8✓ Branch 1 taken 4967 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4456 times.
✓ Branch 4 taken 511 times.
✓ Branch 6 taken 4456 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 511 times.
✗ Branch 10 not taken.
|
4967 | t = ((T[1] < 0.0) ? -T[1] : T[1]); |
| 187 | |||
| 188 | // if(t > (a[1] + Bf.dotY(b))) | ||
| 189 |
5/8✓ Branch 1 taken 4967 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4967 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4967 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1102 times.
✓ Branch 10 taken 3865 times.
|
4967 | if (t > (a[1] + Bf.row(1).dot(b))) return true; |
| 190 | |||
| 191 | // A0 x A1 = A2 | ||
| 192 |
5/8✓ Branch 1 taken 3865 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1455 times.
✓ Branch 4 taken 2410 times.
✓ Branch 6 taken 1455 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 2410 times.
✗ Branch 10 not taken.
|
3865 | t = ((T[2] < 0.0) ? -T[2] : T[2]); |
| 193 | |||
| 194 | // if(t > (a[2] + Bf.dotZ(b))) | ||
| 195 |
5/8✓ Branch 1 taken 3865 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3865 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3865 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 149 times.
✓ Branch 10 taken 3716 times.
|
3865 | if (t > (a[2] + Bf.row(2).dot(b))) return true; |
| 196 | |||
| 197 | // B2 x B0 = B1 | ||
| 198 | // s = B.transposeDotY(T); | ||
| 199 |
2/4✓ Branch 1 taken 3716 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3716 times.
✗ Branch 5 not taken.
|
3716 | s = B.col(1).dot(T); |
| 200 |
2/2✓ Branch 0 taken 1667 times.
✓ Branch 1 taken 2049 times.
|
3716 | t = ((s < 0.0) ? -s : s); |
| 201 | |||
| 202 | // if(t > (b[1] + Bf.transposeDotY(a))) | ||
| 203 |
5/8✓ Branch 1 taken 3716 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3716 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3716 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 104 times.
✓ Branch 10 taken 3612 times.
|
3716 | if (t > (b[1] + Bf.col(1).dot(a))) return true; |
| 204 | |||
| 205 | // B0 x B1 = B2 | ||
| 206 | // s = B.transposeDotZ(T); | ||
| 207 |
2/4✓ Branch 1 taken 3612 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3612 times.
✗ Branch 5 not taken.
|
3612 | s = B.col(2).dot(T); |
| 208 |
2/2✓ Branch 0 taken 1738 times.
✓ Branch 1 taken 1874 times.
|
3612 | t = ((s < 0.0) ? -s : s); |
| 209 | |||
| 210 | // if(t > (b[2] + Bf.transposeDotZ(a))) | ||
| 211 |
5/8✓ Branch 1 taken 3612 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3612 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3612 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 107 times.
✓ Branch 10 taken 3505 times.
|
3612 | if (t > (b[2] + Bf.col(2).dot(a))) return true; |
| 212 | |||
| 213 | // A0 x B0 | ||
| 214 |
4/8✓ Branch 1 taken 3505 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3505 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3505 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3505 times.
✗ Branch 11 not taken.
|
3505 | s = T[2] * B(1, 0) - T[1] * B(2, 0); |
| 215 |
2/2✓ Branch 0 taken 1099 times.
✓ Branch 1 taken 2406 times.
|
3505 | t = ((s < 0.0) ? -s : s); |
| 216 | |||
| 217 | 3505 | if (t > | |
| 218 |
10/18✓ Branch 1 taken 3505 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3505 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3505 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3505 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3505 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3505 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3505 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3505 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 21 times.
✓ Branch 25 taken 3484 times.
|
3505 | (a[1] * Bf(2, 0) + a[2] * Bf(1, 0) + b[1] * Bf(0, 2) + b[2] * Bf(0, 1))) |
| 219 | 21 | return true; | |
| 220 | |||
| 221 | // A0 x B1 | ||
| 222 |
4/8✓ Branch 1 taken 3484 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3484 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3484 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3484 times.
✗ Branch 11 not taken.
|
3484 | s = T[2] * B(1, 1) - T[1] * B(2, 1); |
| 223 |
2/2✓ Branch 0 taken 1913 times.
✓ Branch 1 taken 1571 times.
|
3484 | t = ((s < 0.0) ? -s : s); |
| 224 | |||
| 225 | 3484 | if (t > | |
| 226 |
10/18✓ Branch 1 taken 3484 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3484 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3484 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3484 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3484 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3484 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3484 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3484 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 4 times.
✓ Branch 25 taken 3480 times.
|
3484 | (a[1] * Bf(2, 1) + a[2] * Bf(1, 1) + b[0] * Bf(0, 2) + b[2] * Bf(0, 0))) |
| 227 | 4 | return true; | |
| 228 | |||
| 229 | // A0 x B2 | ||
| 230 |
4/8✓ Branch 1 taken 3480 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3480 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3480 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3480 times.
✗ Branch 11 not taken.
|
3480 | s = T[2] * B(1, 2) - T[1] * B(2, 2); |
| 231 |
2/2✓ Branch 0 taken 1982 times.
✓ Branch 1 taken 1498 times.
|
3480 | t = ((s < 0.0) ? -s : s); |
| 232 | |||
| 233 | 3480 | if (t > | |
| 234 |
10/18✓ Branch 1 taken 3480 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3480 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3480 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3480 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3480 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3480 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3480 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3480 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 18 times.
✓ Branch 25 taken 3462 times.
|
3480 | (a[1] * Bf(2, 2) + a[2] * Bf(1, 2) + b[0] * Bf(0, 1) + b[1] * Bf(0, 0))) |
| 235 | 18 | return true; | |
| 236 | |||
| 237 | // A1 x B0 | ||
| 238 |
4/8✓ Branch 1 taken 3462 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3462 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3462 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3462 times.
✗ Branch 11 not taken.
|
3462 | s = T[0] * B(2, 0) - T[2] * B(0, 0); |
| 239 |
2/2✓ Branch 0 taken 1612 times.
✓ Branch 1 taken 1850 times.
|
3462 | t = ((s < 0.0) ? -s : s); |
| 240 | |||
| 241 | 3462 | if (t > | |
| 242 |
10/18✓ Branch 1 taken 3462 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3462 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3462 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3462 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3462 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3462 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3462 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3462 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 8 times.
✓ Branch 25 taken 3454 times.
|
3462 | (a[0] * Bf(2, 0) + a[2] * Bf(0, 0) + b[1] * Bf(1, 2) + b[2] * Bf(1, 1))) |
| 243 | 8 | return true; | |
| 244 | |||
| 245 | // A1 x B1 | ||
| 246 |
4/8✓ Branch 1 taken 3454 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3454 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3454 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3454 times.
✗ Branch 11 not taken.
|
3454 | s = T[0] * B(2, 1) - T[2] * B(0, 1); |
| 247 |
2/2✓ Branch 0 taken 1446 times.
✓ Branch 1 taken 2008 times.
|
3454 | t = ((s < 0.0) ? -s : s); |
| 248 | |||
| 249 | 3454 | if (t > | |
| 250 |
10/18✓ Branch 1 taken 3454 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3454 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3454 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3454 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3454 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3454 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3454 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3454 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 2 times.
✓ Branch 25 taken 3452 times.
|
3454 | (a[0] * Bf(2, 1) + a[2] * Bf(0, 1) + b[0] * Bf(1, 2) + b[2] * Bf(1, 0))) |
| 251 | 2 | return true; | |
| 252 | |||
| 253 | // A1 x B2 | ||
| 254 |
4/8✓ Branch 1 taken 3452 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3452 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3452 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3452 times.
✗ Branch 11 not taken.
|
3452 | s = T[0] * B(2, 2) - T[2] * B(0, 2); |
| 255 |
2/2✓ Branch 0 taken 1940 times.
✓ Branch 1 taken 1512 times.
|
3452 | t = ((s < 0.0) ? -s : s); |
| 256 | |||
| 257 | 3452 | if (t > | |
| 258 |
10/18✓ Branch 1 taken 3452 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3452 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3452 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3452 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3452 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3452 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3452 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3452 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 12 times.
✓ Branch 25 taken 3440 times.
|
3452 | (a[0] * Bf(2, 2) + a[2] * Bf(0, 2) + b[0] * Bf(1, 1) + b[1] * Bf(1, 0))) |
| 259 | 12 | return true; | |
| 260 | |||
| 261 | // A2 x B0 | ||
| 262 |
4/8✓ Branch 1 taken 3440 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3440 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3440 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3440 times.
✗ Branch 11 not taken.
|
3440 | s = T[1] * B(0, 0) - T[0] * B(1, 0); |
| 263 |
2/2✓ Branch 0 taken 1889 times.
✓ Branch 1 taken 1551 times.
|
3440 | t = ((s < 0.0) ? -s : s); |
| 264 | |||
| 265 | 3440 | if (t > | |
| 266 |
10/18✓ Branch 1 taken 3440 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3440 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3440 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3440 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3440 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3440 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3440 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3440 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 30 times.
✓ Branch 25 taken 3410 times.
|
3440 | (a[0] * Bf(1, 0) + a[1] * Bf(0, 0) + b[1] * Bf(2, 2) + b[2] * Bf(2, 1))) |
| 267 | 30 | return true; | |
| 268 | |||
| 269 | // A2 x B1 | ||
| 270 |
4/8✓ Branch 1 taken 3410 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3410 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3410 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3410 times.
✗ Branch 11 not taken.
|
3410 | s = T[1] * B(0, 1) - T[0] * B(1, 1); |
| 271 |
2/2✓ Branch 0 taken 1496 times.
✓ Branch 1 taken 1914 times.
|
3410 | t = ((s < 0.0) ? -s : s); |
| 272 | |||
| 273 | 3410 | if (t > | |
| 274 |
10/18✓ Branch 1 taken 3410 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3410 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3410 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3410 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3410 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3410 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3410 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3410 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 50 times.
✓ Branch 25 taken 3360 times.
|
3410 | (a[0] * Bf(1, 1) + a[1] * Bf(0, 1) + b[0] * Bf(2, 2) + b[2] * Bf(2, 0))) |
| 275 | 50 | return true; | |
| 276 | |||
| 277 | // A2 x B2 | ||
| 278 |
4/8✓ Branch 1 taken 3360 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3360 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3360 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3360 times.
✗ Branch 11 not taken.
|
3360 | s = T[1] * B(0, 2) - T[0] * B(1, 2); |
| 279 |
2/2✓ Branch 0 taken 1546 times.
✓ Branch 1 taken 1814 times.
|
3360 | t = ((s < 0.0) ? -s : s); |
| 280 | |||
| 281 | 3360 | if (t > | |
| 282 |
10/18✓ Branch 1 taken 3360 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3360 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3360 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3360 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3360 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3360 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3360 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3360 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 8 times.
✓ Branch 25 taken 3352 times.
|
3360 | (a[0] * Bf(1, 2) + a[1] * Bf(0, 2) + b[0] * Bf(2, 1) + b[1] * Bf(2, 0))) |
| 283 | 8 | return true; | |
| 284 | |||
| 285 | 3352 | return false; | |
| 286 | } | ||
| 287 | |||
| 288 | namespace internal { | ||
| 289 | 227393 | inline Scalar obbDisjoint_check_A_axis(const Vec3s& T, const Vec3s& a, | |
| 290 | const Vec3s& b, const Matrix3s& Bf) { | ||
| 291 | // |T| - |B| * b - a | ||
| 292 |
3/6✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 227393 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 227393 times.
✗ Branch 8 not taken.
|
227393 | Vec3s AABB_corner(T.cwiseAbs() - a); |
| 293 |
3/6✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 227393 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 227393 times.
✗ Branch 8 not taken.
|
227393 | AABB_corner.noalias() -= Bf * b; |
| 294 |
4/8✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 227393 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 227393 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 227393 times.
✗ Branch 11 not taken.
|
227393 | return AABB_corner.array().max(Scalar(0)).matrix().squaredNorm(); |
| 295 | } | ||
| 296 | |||
| 297 | 130812 | inline Scalar obbDisjoint_check_B_axis(const Matrix3s& B, const Vec3s& T, | |
| 298 | const Vec3s& a, const Vec3s& b, | ||
| 299 | const Matrix3s& Bf) { | ||
| 300 | // Bf = |B| | ||
| 301 | // | B^T T| - Bf^T * a - b | ||
| 302 | 130812 | Scalar s, t = 0; | |
| 303 |
5/10✓ Branch 1 taken 130812 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 130812 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 130812 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 130812 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 130812 times.
✗ Branch 15 not taken.
|
130812 | s = std::abs(B.col(0).dot(T)) - Bf.col(0).dot(a) - b[0]; |
| 304 |
2/2✓ Branch 0 taken 1232 times.
✓ Branch 1 taken 129580 times.
|
130812 | if (s > 0) t += s * s; |
| 305 |
5/10✓ Branch 1 taken 130812 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 130812 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 130812 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 130812 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 130812 times.
✗ Branch 15 not taken.
|
130812 | s = std::abs(B.col(1).dot(T)) - Bf.col(1).dot(a) - b[1]; |
| 306 |
2/2✓ Branch 0 taken 4304 times.
✓ Branch 1 taken 126508 times.
|
130812 | if (s > 0) t += s * s; |
| 307 |
5/10✓ Branch 1 taken 130812 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 130812 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 130812 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 130812 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 130812 times.
✗ Branch 15 not taken.
|
130812 | s = std::abs(B.col(2).dot(T)) - Bf.col(2).dot(a) - b[2]; |
| 308 |
2/2✓ Branch 0 taken 13764 times.
✓ Branch 1 taken 117048 times.
|
130812 | if (s > 0) t += s * s; |
| 309 | 130812 | return t; | |
| 310 | } | ||
| 311 | |||
| 312 | template <int ib, int jb = (ib + 1) % 3, int kb = (ib + 2) % 3> | ||
| 313 | struct COAL_LOCAL obbDisjoint_check_Ai_cross_Bi { | ||
| 314 | 1955040 | static inline bool run(int ia, int ja, int ka, const Matrix3s& B, | |
| 315 | const Vec3s& T, const Vec3s& a, const Vec3s& b, | ||
| 316 | const Matrix3s& Bf, const Scalar& breakDistance2, | ||
| 317 | Scalar& squaredLowerBoundDistance) { | ||
| 318 | 1955040 | Scalar sinus2 = 1 - Bf(ia, ib) * Bf(ia, ib); | |
| 319 |
2/2✓ Branch 0 taken 1610 times.
✓ Branch 1 taken 975910 times.
|
1955040 | if (sinus2 < 1e-6) return false; |
| 320 | |||
| 321 | 1951820 | const Scalar s = T[ka] * B(ja, ib) - T[ja] * B(ka, ib); | |
| 322 | |||
| 323 | 1951820 | const Scalar diff = fabs(s) - (a[ja] * Bf(ka, ib) + a[ka] * Bf(ja, ib) + | |
| 324 | 1951820 | b[jb] * Bf(ia, kb) + b[kb] * Bf(ia, jb)); | |
| 325 | // We need to divide by the norm || Aia x Bib || | ||
| 326 | // As ||Aia|| = ||Bib|| = 1, (Aia | Bib)^2 = cosine^2 | ||
| 327 |
2/2✓ Branch 0 taken 5990 times.
✓ Branch 1 taken 969920 times.
|
1951820 | if (diff > 0) { |
| 328 | 11980 | squaredLowerBoundDistance = diff * diff / sinus2; | |
| 329 |
2/2✓ Branch 0 taken 5847 times.
✓ Branch 1 taken 143 times.
|
11980 | if (squaredLowerBoundDistance > breakDistance2) { |
| 330 | 11694 | return true; | |
| 331 | } | ||
| 332 | } | ||
| 333 | 1940126 | return false; | |
| 334 | } // namespace internal | ||
| 335 | }; // namespace coal | ||
| 336 | } // namespace internal | ||
| 337 | |||
| 338 | // B, T orientation and position of 2nd OBB in frame of 1st OBB, | ||
| 339 | // a extent of 1st OBB, | ||
| 340 | // b extent of 2nd OBB. | ||
| 341 | // | ||
| 342 | // This function tests whether bounding boxes should be broken down. | ||
| 343 | // | ||
| 344 | 227393 | bool obbDisjointAndLowerBoundDistance(const Matrix3s& B, const Vec3s& T, | |
| 345 | const Vec3s& a_, const Vec3s& b_, | ||
| 346 | const CollisionRequest& request, | ||
| 347 | Scalar& squaredLowerBoundDistance) { | ||
| 348 |
3/6✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 227393 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 227393 times.
✗ Branch 9 not taken.
|
227393 | assert(request.security_margin > |
| 349 | -2 * (std::min)(a_.minCoeff(), b_.minCoeff()) - | ||
| 350 | 10 * Eigen::NumTraits<Scalar>::epsilon() && | ||
| 351 | "A negative security margin could not be lower than the OBB extent."); | ||
| 352 | // const Scalar breakDistance(request.break_distance + | ||
| 353 | // request.security_margin); | ||
| 354 | 227393 | const Scalar breakDistance2 = request.break_distance * request.break_distance; | |
| 355 | |||
| 356 |
2/4✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 227393 times.
✗ Branch 5 not taken.
|
227393 | Matrix3s Bf(B.cwiseAbs()); |
| 357 |
2/4✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 227393 times.
✗ Branch 5 not taken.
|
227393 | const Vec3s a((a_ + Vec3s::Constant(request.security_margin / 2)) |
| 358 |
1/2✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
|
227393 | .array() |
| 359 |
2/4✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 227393 times.
✗ Branch 5 not taken.
|
227393 | .max(Scalar(0))); |
| 360 |
2/4✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 227393 times.
✗ Branch 5 not taken.
|
227393 | const Vec3s b((b_ + Vec3s::Constant(request.security_margin / 2)) |
| 361 |
1/2✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
|
227393 | .array() |
| 362 |
2/4✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 227393 times.
✗ Branch 5 not taken.
|
227393 | .max(Scalar(0))); |
| 363 | |||
| 364 | // Corner of b axis aligned bounding box the closest to the origin | ||
| 365 |
1/2✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
|
227393 | squaredLowerBoundDistance = internal::obbDisjoint_check_A_axis(T, a, b, Bf); |
| 366 |
2/2✓ Branch 0 taken 96581 times.
✓ Branch 1 taken 130812 times.
|
227393 | if (squaredLowerBoundDistance > breakDistance2) return true; |
| 367 | |||
| 368 | 130812 | squaredLowerBoundDistance = | |
| 369 |
1/2✓ Branch 1 taken 130812 times.
✗ Branch 2 not taken.
|
130812 | internal::obbDisjoint_check_B_axis(B, T, a, b, Bf); |
| 370 |
2/2✓ Branch 0 taken 17927 times.
✓ Branch 1 taken 112885 times.
|
130812 | if (squaredLowerBoundDistance > breakDistance2) return true; |
| 371 | |||
| 372 | // Ai x Bj | ||
| 373 | 112885 | int ja = 1, ka = 2; | |
| 374 |
2/2✓ Branch 0 taken 329212 times.
✓ Branch 1 taken 107038 times.
|
436250 | for (int ia = 0; ia < 3; ++ia) { |
| 375 |
3/4✓ Branch 1 taken 329212 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4505 times.
✓ Branch 4 taken 324707 times.
|
329212 | if (internal::obbDisjoint_check_Ai_cross_Bi<0>::run( |
| 376 | ia, ja, ka, B, T, a, b, Bf, breakDistance2, | ||
| 377 | squaredLowerBoundDistance)) | ||
| 378 | 4505 | return true; | |
| 379 |
3/4✓ Branch 1 taken 324707 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1106 times.
✓ Branch 4 taken 323601 times.
|
324707 | if (internal::obbDisjoint_check_Ai_cross_Bi<1>::run( |
| 380 | ia, ja, ka, B, T, a, b, Bf, breakDistance2, | ||
| 381 | squaredLowerBoundDistance)) | ||
| 382 | 1106 | return true; | |
| 383 |
3/4✓ Branch 1 taken 323601 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 236 times.
✓ Branch 4 taken 323365 times.
|
323601 | if (internal::obbDisjoint_check_Ai_cross_Bi<2>::run( |
| 384 | ia, ja, ka, B, T, a, b, Bf, breakDistance2, | ||
| 385 | squaredLowerBoundDistance)) | ||
| 386 | 236 | return true; | |
| 387 | 323365 | ja = ka; | |
| 388 | 323365 | ka = ia; | |
| 389 | } | ||
| 390 | |||
| 391 | 107038 | return false; | |
| 392 | } | ||
| 393 | |||
| 394 | 6000 | bool OBB::overlap(const OBB& other) const { | |
| 395 | /// compute what transform [R,T] that takes us from cs1 to cs2. | ||
| 396 | /// [R,T] = [R1,T1]'[R2,T2] = [R1',-R1'T][R2,T2] = [R1'R2, R1'(T2-T1)] | ||
| 397 | /// First compute the rotation part, then translation part | ||
| 398 |
4/8✓ Branch 1 taken 6000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6000 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6000 times.
✗ Branch 11 not taken.
|
6000 | Vec3s T(axes.transpose() * (other.To - To)); |
| 399 |
3/6✓ Branch 1 taken 6000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6000 times.
✗ Branch 8 not taken.
|
6000 | Matrix3s R(axes.transpose() * other.axes); |
| 400 | |||
| 401 |
1/2✓ Branch 1 taken 6000 times.
✗ Branch 2 not taken.
|
12000 | return !obbDisjoint(R, T, extent, other.extent); |
| 402 | } | ||
| 403 | |||
| 404 | 154162 | bool OBB::overlap(const OBB& other, const CollisionRequest& request, | |
| 405 | Scalar& sqrDistLowerBound) const { | ||
| 406 | /// compute what transform [R,T] that takes us from cs1 to cs2. | ||
| 407 | /// [R,T] = [R1,T1]'[R2,T2] = [R1',-R1'T][R2,T2] = [R1'R2, R1'(T2-T1)] | ||
| 408 | /// First compute the rotation part, then translation part | ||
| 409 | // Vec3s t = other.To - To; // T2 - T1 | ||
| 410 | // Vec3s T(t.dot(axis[0]), t.dot(axis[1]), t.dot(axis[2])); // R1'(T2-T1) | ||
| 411 | // Matrix3s R(axis[0].dot(other.axis[0]), axis[0].dot(other.axis[1]), | ||
| 412 | // axis[0].dot(other.axis[2]), | ||
| 413 | // axis[1].dot(other.axis[0]), axis[1].dot(other.axis[1]), | ||
| 414 | // axis[1].dot(other.axis[2]), | ||
| 415 | // axis[2].dot(other.axis[0]), axis[2].dot(other.axis[1]), | ||
| 416 | // axis[2].dot(other.axis[2])); | ||
| 417 |
4/8✓ Branch 1 taken 154162 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 154162 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 154162 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 154162 times.
✗ Branch 11 not taken.
|
154162 | Vec3s T(axes.transpose() * (other.To - To)); |
| 418 |
3/6✓ Branch 1 taken 154162 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 154162 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 154162 times.
✗ Branch 8 not taken.
|
154162 | Matrix3s R(axes.transpose() * other.axes); |
| 419 | |||
| 420 |
1/2✓ Branch 1 taken 154162 times.
✗ Branch 2 not taken.
|
154162 | return !obbDisjointAndLowerBoundDistance(R, T, extent, other.extent, request, |
| 421 | 154162 | sqrDistLowerBound); | |
| 422 | } | ||
| 423 | |||
| 424 | ✗ | bool OBB::contain(const Vec3s& p) const { | |
| 425 | ✗ | Vec3s local_p(p - To); | |
| 426 | ✗ | Scalar proj = local_p.dot(axes.col(0)); | |
| 427 | ✗ | if ((proj > extent[0]) || (proj < -extent[0])) return false; | |
| 428 | |||
| 429 | ✗ | proj = local_p.dot(axes.col(1)); | |
| 430 | ✗ | if ((proj > extent[1]) || (proj < -extent[1])) return false; | |
| 431 | |||
| 432 | ✗ | proj = local_p.dot(axes.col(2)); | |
| 433 | ✗ | if ((proj > extent[2]) || (proj < -extent[2])) return false; | |
| 434 | |||
| 435 | ✗ | return true; | |
| 436 | } | ||
| 437 | |||
| 438 | ✗ | OBB& OBB::operator+=(const Vec3s& p) { | |
| 439 | ✗ | OBB bvp; | |
| 440 | ✗ | bvp.To = p; | |
| 441 | ✗ | bvp.axes.noalias() = axes; | |
| 442 | ✗ | bvp.extent.setZero(); | |
| 443 | |||
| 444 | ✗ | *this += bvp; | |
| 445 | ✗ | return *this; | |
| 446 | } | ||
| 447 | |||
| 448 | 19611 | OBB OBB::operator+(const OBB& other) const { | |
| 449 |
2/4✓ Branch 1 taken 19611 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 19611 times.
✗ Branch 5 not taken.
|
19611 | Vec3s center_diff = To - other.To; |
| 450 |
3/6✓ Branch 1 taken 19611 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 19611 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 19611 times.
✗ Branch 8 not taken.
|
19611 | Scalar max_extent = std::max(std::max(extent[0], extent[1]), extent[2]); |
| 451 | Scalar max_extent2 = | ||
| 452 |
3/6✓ Branch 1 taken 19611 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 19611 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 19611 times.
✗ Branch 8 not taken.
|
19611 | std::max(std::max(other.extent[0], other.extent[1]), other.extent[2]); |
| 453 |
3/4✓ Branch 1 taken 19611 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 21 times.
✓ Branch 4 taken 19590 times.
|
19611 | if (center_diff.norm() > 2 * (max_extent + max_extent2)) { |
| 454 |
1/2✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
|
21 | return merge_largedist(*this, other); |
| 455 | } else { | ||
| 456 |
1/2✓ Branch 1 taken 19590 times.
✗ Branch 2 not taken.
|
19590 | return merge_smalldist(*this, other); |
| 457 | } | ||
| 458 | } | ||
| 459 | |||
| 460 | ✗ | Scalar OBB::distance(const OBB& /*other*/, Vec3s* /*P*/, Vec3s* /*Q*/) const { | |
| 461 | ✗ | std::cerr << "OBB distance not implemented!" << std::endl; | |
| 462 | ✗ | return 0.0; | |
| 463 | } | ||
| 464 | |||
| 465 | ✗ | bool overlap(const Matrix3s& R0, const Vec3s& T0, const OBB& b1, | |
| 466 | const OBB& b2) { | ||
| 467 | ✗ | Vec3s Ttemp(R0.transpose() * (b2.To - T0) - b1.To); | |
| 468 | ✗ | Vec3s T(b1.axes.transpose() * Ttemp); | |
| 469 | ✗ | Matrix3s R(b1.axes.transpose() * R0.transpose() * b2.axes); | |
| 470 | |||
| 471 | ✗ | return !obbDisjoint(R, T, b1.extent, b2.extent); | |
| 472 | } | ||
| 473 | |||
| 474 | 73231 | bool overlap(const Matrix3s& R0, const Vec3s& T0, const OBB& b1, const OBB& b2, | |
| 475 | const CollisionRequest& request, Scalar& sqrDistLowerBound) { | ||
| 476 |
5/10✓ Branch 1 taken 73231 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 73231 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 73231 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 73231 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 73231 times.
✗ Branch 14 not taken.
|
73231 | Vec3s Ttemp(R0.transpose() * (b2.To - T0) - b1.To); |
| 477 |
3/6✓ Branch 1 taken 73231 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 73231 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 73231 times.
✗ Branch 8 not taken.
|
73231 | Vec3s T(b1.axes.transpose() * Ttemp); |
| 478 |
5/10✓ Branch 1 taken 73231 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 73231 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 73231 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 73231 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 73231 times.
✗ Branch 14 not taken.
|
73231 | Matrix3s R(b1.axes.transpose() * R0.transpose() * b2.axes); |
| 479 | |||
| 480 |
1/2✓ Branch 1 taken 73231 times.
✗ Branch 2 not taken.
|
73231 | return !obbDisjointAndLowerBoundDistance(R, T, b1.extent, b2.extent, request, |
| 481 | 73231 | sqrDistLowerBound); | |
| 482 | } | ||
| 483 | |||
| 484 | ✗ | OBB translate(const OBB& bv, const Vec3s& t) { | |
| 485 | ✗ | OBB res(bv); | |
| 486 | ✗ | res.To += t; | |
| 487 | ✗ | return res; | |
| 488 | } | ||
| 489 | |||
| 490 | } // namespace coal | ||
| 491 |