GCC Code Coverage Report


Directory: ./
File: test/security_margin.cpp
Date: 2025-04-01 09:23:31
Exec Total Coverage
Lines: 277 277 100.0%
Branches: 792 1584 50.0%

Line Branch Exec Source
1 /*
2 * Software License Agreement (BSD License)
3 *
4 * Copyright (c) 2022, INRIA.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials provided
16 * with the distribution.
17 * * Neither the name of Willow Garage, Inc. nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGE.
33 */
34
35 #define BOOST_TEST_MODULE COAL_SECURITY_MARGIN
36 #include <boost/test/included/unit_test.hpp>
37
38 #include <cmath>
39 #include <iostream>
40 #include "coal/distance.h"
41 #include "coal/math/transform.h"
42 #include "coal/collision.h"
43 #include "coal/collision_object.h"
44 #include "coal/shape/geometric_shapes.h"
45 #include "coal/shape/geometric_shapes_utility.h"
46 #include "coal/shape/geometric_shape_to_BVH_model.h"
47
48 #include "utility.h"
49
50 using namespace coal;
51 using coal::CollisionGeometryPtr_t;
52 using coal::CollisionRequest;
53 using coal::CollisionResult;
54 using coal::Transform3s;
55 using coal::Vec3s;
56
57 #define MATH_SQUARED(x) (x * x)
58
59
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(aabb_aabb) {
60
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 CollisionGeometryPtr_t b1(new coal::Box(1, 1, 1));
61
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 CollisionGeometryPtr_t b2(new coal::Box(1, 1, 1));
62
63
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Transform3s tf1;
64
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 const Transform3s tf2_collision(Vec3s(0, 1, 1));
65
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::Box s1(1, 1, 1);
66
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::Box s2(1, 1, 1);
67 2 const Scalar tol = Scalar(1e-8);
68
69
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 AABB bv1, bv2;
70
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 computeBV(s1, Transform3s(), bv1);
71
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 computeBV(s2, Transform3s(), bv2);
72
73 // No security margin - collision
74 {
75
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionRequest collisionRequest(CONTACT, 1);
76
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 AABB bv2_transformed;
77
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeBV(s2, tf2_collision, bv2_transformed);
78 Scalar sqrDistLowerBound;
79 bool res =
80
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 bv1.overlap(bv2_transformed, collisionRequest, sqrDistLowerBound);
81
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
2 BOOST_CHECK(res);
82
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_CLOSE(sqrDistLowerBound, 0, tol);
83 }
84
85 // No security margin - no collision
86 {
87
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionRequest collisionRequest(CONTACT, 1);
88 2 const Scalar distance = Scalar(0.01);
89 Transform3s tf2_no_collision(
90
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
2 Vec3s(tf2_collision.getTranslation() + Vec3s(0, 0, distance)));
91
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 AABB bv2_transformed;
92
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeBV(s2, tf2_no_collision, bv2_transformed);
93 Scalar sqrDistLowerBound;
94 bool res =
95
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 bv1.overlap(bv2_transformed, collisionRequest, sqrDistLowerBound);
96
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
2 BOOST_CHECK(!res);
97
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_CLOSE(sqrDistLowerBound, MATH_SQUARED(distance), tol);
98 }
99
100 // Security margin - collision
101 {
102
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionRequest collisionRequest(CONTACT, 1);
103 2 const Scalar distance = Scalar(0.01);
104 2 collisionRequest.security_margin = distance;
105 Transform3s tf2_no_collision(
106
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
2 Vec3s(tf2_collision.getTranslation() + Vec3s(0, 0, distance)));
107
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 AABB bv2_transformed;
108
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeBV(s2, tf2_no_collision, bv2_transformed);
109 Scalar sqrDistLowerBound;
110 bool res =
111
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 bv1.overlap(bv2_transformed, collisionRequest, sqrDistLowerBound);
112
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
2 BOOST_CHECK(res);
113
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
2 BOOST_CHECK_SMALL(sqrDistLowerBound, tol);
114 }
115
116 // Negative security margin - collion because the two boxes are in contact
117 {
118
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionRequest collisionRequest(CONTACT, 1);
119 2 const Scalar distance = Scalar(-0.01);
120 2 collisionRequest.security_margin = distance;
121 const Transform3s tf2(
122
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
2 Vec3s(tf2_collision.getTranslation() + Vec3s(0, distance, distance)));
123
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 AABB bv2_transformed;
124
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeBV(s2, tf2, bv2_transformed);
125 Scalar sqrDistLowerBound;
126 bool res =
127
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 bv1.overlap(bv2_transformed, collisionRequest, sqrDistLowerBound);
128
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
2 BOOST_CHECK(res);
129
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
2 BOOST_CHECK_SMALL(sqrDistLowerBound, tol);
130 }
131
132 // Negative security margin - no collision
133 {
134
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionRequest collisionRequest(CONTACT, 1);
135 2 const Scalar distance = Scalar(-0.01);
136 2 collisionRequest.security_margin = distance;
137
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 AABB bv2_transformed;
138
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeBV(s2, tf2_collision, bv2_transformed);
139 Scalar sqrDistLowerBound;
140 bool res =
141
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 bv1.overlap(bv2_transformed, collisionRequest, sqrDistLowerBound);
142
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
2 BOOST_CHECK(!res);
143
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
2 BOOST_CHECK_CLOSE(
144 sqrDistLowerBound,
145 MATH_SQUARED((std::sqrt(2) * collisionRequest.security_margin)), tol);
146 }
147 2 }
148
149
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(aabb_aabb_degenerated_cases) {
150
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 CollisionGeometryPtr_t b1(new coal::Box(1, 1, 1));
151
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 CollisionGeometryPtr_t b2(new coal::Box(1, 1, 1));
152
153
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Transform3s tf1;
154
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 const Transform3s tf2_collision(Vec3s(0, 0, 0));
155
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::Box s1(1, 1, 1);
156
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::Box s2(1, 1, 1);
157
158
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 AABB bv1, bv2;
159
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 computeBV(s1, Transform3s(), bv1);
160
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 computeBV(s2, Transform3s(), bv2);
161
162 // The two AABB are collocated
163 {
164
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionRequest collisionRequest(CONTACT, 1);
165 2 const Scalar distance = -2.;
166 2 collisionRequest.security_margin = distance;
167
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 AABB bv2_transformed;
168
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeBV(s2, tf2_collision, bv2_transformed);
169 Scalar sqrDistLowerBound;
170 bool res =
171
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 bv1.overlap(bv2_transformed, collisionRequest, sqrDistLowerBound);
172
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
2 BOOST_CHECK(!res);
173 }
174
175
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const AABB bv3;
176
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
2 BOOST_CHECK(!bv1.overlap(bv3));
177 2 }
178
179
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(sphere_sphere) {
180
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 CollisionGeometryPtr_t s1(new coal::Sphere(1));
181
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 CollisionGeometryPtr_t s2(new coal::Sphere(2));
182
183
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Transform3s tf1;
184
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 const Transform3s tf2_collision(Vec3s(0, 0, 3));
185
186 // NOTE: when comparing a result to zero, **do not use BOOST_CHECK_CLOSE**!
187 // Zero is not close to any other number, so the test will always fail.
188 // Instead, use BOOST_CHECK_SMALL.
189
190 // No security margin - collision
191 {
192
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionRequest collisionRequest(CONTACT, 1);
193
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult collisionResult;
194
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 collide(s1.get(), tf1, s2.get(), tf2_collision, collisionRequest,
195 collisionResult);
196
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK(collisionResult.isCollision());
197
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
2 BOOST_CHECK_SMALL(collisionResult.distance_lower_bound, Scalar(1e-8));
198
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_SMALL(collisionResult.getContact(0).penetration_depth,
199 Scalar(1e-8));
200 2 }
201
202 // No security margin - no collision
203 {
204
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionRequest collisionRequest(CONTACT, 1);
205
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult collisionResult;
206 2 const Scalar distance = Scalar(0.01);
207 Transform3s tf2_no_collision(
208
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
2 Vec3s(tf2_collision.getTranslation() + Vec3s(0, 0, distance)));
209
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 collide(s1.get(), tf1, s2.get(), tf2_no_collision, collisionRequest,
210 collisionResult);
211
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK(!collisionResult.isCollision());
212
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_CLOSE(collisionResult.distance_lower_bound, distance,
213 Scalar(1e-8));
214 2 }
215
216 // Positive security margin - collision
217 {
218
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionRequest collisionRequest(CONTACT, 1);
219
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult collisionResult;
220 2 const Scalar distance = Scalar(0.01);
221 2 collisionRequest.security_margin = distance;
222 Transform3s tf2(
223
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
2 Vec3s(tf2_collision.getTranslation() + Vec3s(0, 0, distance)));
224
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 collide(s1.get(), tf1, s2.get(), tf2, collisionRequest, collisionResult);
225
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK(collisionResult.isCollision());
226
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
2 BOOST_CHECK_SMALL(collisionResult.distance_lower_bound, Scalar(1e-8));
227
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK_CLOSE(collisionResult.getContact(0).penetration_depth, distance,
228 1e-8);
229 2 }
230
231 // Negative security margin - collion because the two spheres are in contact
232 {
233
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionRequest collisionRequest(CONTACT, 1);
234
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult collisionResult;
235 2 const Scalar distance = Scalar(-0.01);
236 2 collisionRequest.security_margin = distance;
237 Transform3s tf2(
238
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
2 Vec3s(tf2_collision.getTranslation() + Vec3s(0, 0, distance)));
239
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 collide(s1.get(), tf1, s2.get(), tf2, collisionRequest, collisionResult);
240
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK(collisionResult.isCollision());
241
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
2 BOOST_CHECK_SMALL(collisionResult.distance_lower_bound, Scalar(1e-8));
242
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK_CLOSE(collisionResult.getContact(0).penetration_depth, distance,
243 Scalar(1e-8));
244 2 }
245
246 // Negative security margin - no collision
247 {
248
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionRequest collisionRequest(CONTACT, 1);
249
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult collisionResult;
250 2 collisionRequest.security_margin = Scalar(-0.01);
251
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 collide(s1.get(), tf1, s2.get(), tf2_collision, collisionRequest,
252 collisionResult);
253
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK(!collisionResult.isCollision());
254
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_CLOSE(collisionResult.distance_lower_bound,
255 -collisionRequest.security_margin, Scalar(1e-8));
256 2 }
257 2 }
258
259
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(capsule_capsule) {
260
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 CollisionGeometryPtr_t c1(new coal::Capsule(0.5, 1.));
261
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 CollisionGeometryPtr_t c2(new coal::Capsule(0.5, 1.));
262
263
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Transform3s tf1;
264
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 const Transform3s tf2_collision(Vec3s(0, 1., 0));
265
266 // No security margin - collision
267 {
268
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionRequest collisionRequest(CONTACT, 1);
269
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult collisionResult;
270
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 collide(c1.get(), tf1, c2.get(), tf2_collision, collisionRequest,
271 collisionResult);
272
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK(collisionResult.isCollision());
273
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
2 BOOST_CHECK_SMALL(collisionResult.distance_lower_bound, Scalar(1e-8));
274
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_SMALL(collisionResult.getContact(0).penetration_depth,
275 Scalar(1e-8));
276 2 }
277
278 // No security margin - no collision
279 {
280
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionRequest collisionRequest(CONTACT, 1);
281
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult collisionResult;
282 2 const Scalar distance = Scalar(0.01);
283 Transform3s tf2_no_collision(
284
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
2 Vec3s(tf2_collision.getTranslation() + Vec3s(0, distance, 0)));
285
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 collide(c1.get(), tf1, c2.get(), tf2_no_collision, collisionRequest,
286 collisionResult);
287
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK(!collisionResult.isCollision());
288
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_CLOSE(collisionResult.distance_lower_bound, distance,
289 Scalar(1e-8));
290 2 }
291
292 // Positive security margin - collision
293 {
294
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionRequest collisionRequest(CONTACT, 1);
295
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult collisionResult;
296 2 const Scalar distance = Scalar(0.01);
297 2 collisionRequest.security_margin = distance;
298 Transform3s tf2_no_collision(
299
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
2 Vec3s(tf2_collision.getTranslation() + Vec3s(0, distance, 0)));
300
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 collide(c1.get(), tf1, c2.get(), tf2_no_collision, collisionRequest,
301 collisionResult);
302
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK(collisionResult.isCollision());
303
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
2 BOOST_CHECK_SMALL(collisionResult.distance_lower_bound, Scalar(1e-8));
304
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK_CLOSE(collisionResult.getContact(0).penetration_depth, distance,
305 Scalar(1e-8));
306 2 }
307
308 // Negative security margin - collion because the two capsules are in contact
309 {
310
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionRequest collisionRequest(CONTACT, 1);
311
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult collisionResult;
312 2 const Scalar distance = Scalar(-0.01);
313 2 collisionRequest.security_margin = distance;
314 Transform3s tf2(
315
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
2 Vec3s(tf2_collision.getTranslation() + Vec3s(0, distance, 0)));
316
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 collide(c1.get(), tf1, c2.get(), tf2, collisionRequest, collisionResult);
317
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK(collisionResult.isCollision());
318
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
2 BOOST_CHECK_SMALL(collisionResult.distance_lower_bound, Scalar(1e-8));
319
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK_CLOSE(collisionResult.getContact(0).penetration_depth, distance,
320 Scalar(1e-8));
321 2 }
322
323 // Negative security margin - no collision
324 {
325
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionRequest collisionRequest(CONTACT, 1);
326
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult collisionResult;
327 2 collisionRequest.security_margin = Scalar(-0.01);
328
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 collide(c1.get(), tf1, c2.get(), tf2_collision, collisionRequest,
329 collisionResult);
330
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK(!collisionResult.isCollision());
331
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_CLOSE(collisionResult.distance_lower_bound, Scalar(0.01),
332 Scalar(1e-8));
333 2 }
334 2 }
335
336
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(box_box) {
337
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 CollisionGeometryPtr_t b1(new coal::Box(1, 1, 1));
338
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 CollisionGeometryPtr_t b2(new coal::Box(1, 1, 1));
339
340
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Transform3s tf1;
341
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 const Transform3s tf2_collision(Vec3s(0, 1, 1));
342
343 2 const Scalar tol = Scalar(1e-3);
344
345 // No security margin - collision
346 {
347
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionRequest collisionRequest(CONTACT, 1);
348
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult collisionResult;
349
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 collide(b1.get(), tf1, b2.get(), tf2_collision, collisionRequest,
350 collisionResult);
351
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK(collisionResult.isCollision());
352
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
2 BOOST_CHECK_SMALL(collisionResult.distance_lower_bound, tol);
353
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_SMALL(collisionResult.getContact(0).penetration_depth,
354 Scalar(1e-8));
355 2 }
356
357 // No security margin - no collision
358 {
359
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionRequest collisionRequest(CONTACT, 1);
360 2 const Scalar distance = Scalar(0.01);
361 const Transform3s tf2_no_collision(
362
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
2 (tf2_collision.getTranslation() + Vec3s(0, 0, distance)).eval());
363
364
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult collisionResult;
365
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 collide(b1.get(), tf1, b2.get(), tf2_no_collision, collisionRequest,
366 collisionResult);
367
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK(!collisionResult.isCollision());
368
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_CLOSE(collisionResult.distance_lower_bound, distance, tol);
369 2 }
370
371 // Positive security margin - collision
372 {
373
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionRequest collisionRequest(CONTACT, 1);
374 2 const Scalar distance = Scalar(0.01);
375 2 collisionRequest.security_margin = distance;
376
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult collisionResult;
377
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 collide(b1.get(), tf1, b2.get(), tf2_collision, collisionRequest,
378 collisionResult);
379
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK(collisionResult.isCollision());
380
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_CLOSE(collisionResult.distance_lower_bound,
381 -collisionRequest.security_margin, tol);
382
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_SMALL(collisionResult.getContact(0).penetration_depth,
383 Scalar(1e-8));
384 2 }
385
386 // Negative security margin - no collision
387 {
388
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionRequest collisionRequest(CONTACT, 1);
389 2 collisionRequest.security_margin = Scalar(-0.01);
390
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult collisionResult;
391
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 collide(b1.get(), tf1, b2.get(), tf2_collision, collisionRequest,
392 collisionResult);
393
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK(!collisionResult.isCollision());
394
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_CLOSE(collisionResult.distance_lower_bound,
395 -collisionRequest.security_margin, tol);
396 2 }
397
398 // Negative security margin - collision
399 {
400
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionRequest collisionRequest(CONTACT, 1);
401 2 const Scalar distance = Scalar(-0.01);
402 2 collisionRequest.security_margin = distance;
403
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult collisionResult;
404
405
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 const Transform3s tf2((tf2_collision.getTranslation() +
406
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Vec3s(0, collisionRequest.security_margin,
407 collisionRequest.security_margin))
408
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 .eval());
409
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 collide(b1.get(), tf1, b2.get(), tf2, collisionRequest, collisionResult);
410
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK(collisionResult.isCollision());
411
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
2 BOOST_CHECK_SMALL(collisionResult.distance_lower_bound, tol);
412
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK_CLOSE(collisionResult.getContact(0).penetration_depth, distance,
413 tol);
414 2 }
415 2 }
416
417 template <typename ShapeType1, typename ShapeType2>
418 4 void test_shape_shape(const ShapeType1& shape1, const Transform3s& tf1,
419 const ShapeType2& shape2,
420 const Transform3s& tf2_collision, const Scalar tol) {
421 // No security margin - collision
422 {
423
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 CollisionRequest collisionRequest(CONTACT, 1);
424
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 CollisionResult collisionResult;
425
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 collide(&shape1, tf1, &shape2, tf2_collision, collisionRequest,
426 collisionResult);
427
6/12
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 2 times.
4 BOOST_CHECK(collisionResult.isCollision());
428
5/10
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
4 BOOST_CHECK_SMALL(collisionResult.distance_lower_bound, tol);
429
6/12
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
4 BOOST_CHECK_SMALL(collisionResult.getContact(0).penetration_depth,
430 Scalar(1e-8));
431 4 }
432
433 // No security margin - no collision
434 {
435
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 CollisionRequest collisionRequest(CONTACT, 1);
436 4 const Scalar distance = Scalar(0.01);
437
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
4 const Transform3s tf2_no_collision(
438
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 (tf2_collision.getTranslation() + Vec3s(0, 0, distance)).eval());
439
440
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 CollisionResult collisionResult;
441
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 collide(&shape1, tf1, &shape2, tf2_no_collision, collisionRequest,
442 collisionResult);
443
6/12
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 2 times.
4 BOOST_CHECK(!collisionResult.isCollision());
444
6/12
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
4 BOOST_CHECK_CLOSE(collisionResult.distance_lower_bound, distance, tol);
445 4 }
446
447 // Positive security margin - collision
448 {
449
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 CollisionRequest collisionRequest(CONTACT, 1);
450 4 const Scalar distance = Scalar(0.01);
451 4 collisionRequest.security_margin = distance;
452
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 CollisionResult collisionResult;
453
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 collide(&shape1, tf1, &shape2, tf2_collision, collisionRequest,
454 collisionResult);
455
6/12
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 2 times.
4 BOOST_CHECK(collisionResult.isCollision());
456
6/12
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
4 BOOST_CHECK_CLOSE(collisionResult.distance_lower_bound,
457 -collisionRequest.security_margin, tol);
458
6/12
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
4 BOOST_CHECK_SMALL(collisionResult.getContact(0).penetration_depth,
459 Scalar(1e-8));
460 4 }
461
462 // Negative security margin - no collision
463 {
464
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 CollisionRequest collisionRequest(CONTACT, 1);
465 4 collisionRequest.security_margin = Scalar(-0.01);
466
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 CollisionResult collisionResult;
467
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 collide(&shape1, tf1, &shape2, tf2_collision, collisionRequest,
468 collisionResult);
469
6/12
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 2 times.
4 BOOST_CHECK(!collisionResult.isCollision());
470
8/16
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 2 times.
4 BOOST_CHECK_CLOSE(
471 collisionResult.distance_lower_bound,
472 (collisionRequest.security_margin * tf2_collision.getTranslation())
473 .norm(),
474 tol);
475 4 }
476
477 // Negative security margin - collision
478 {
479
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 CollisionRequest collisionRequest(CONTACT, 1);
480 4 const Scalar distance = Scalar(-0.01);
481 4 collisionRequest.security_margin = distance;
482
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 CollisionResult collisionResult;
483
484
3/6
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
4 const Transform3s tf2((tf2_collision.getTranslation() +
485
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 Vec3s(0, collisionRequest.security_margin,
486 collisionRequest.security_margin))
487 .eval());
488
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 collide(&shape1, tf1, &shape2, tf2, collisionRequest, collisionResult);
489
6/12
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 2 times.
4 BOOST_CHECK(collisionResult.isCollision());
490
5/10
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
4 BOOST_CHECK_SMALL(collisionResult.distance_lower_bound, tol);
491
7/14
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 2 times.
4 BOOST_CHECK_CLOSE(collisionResult.getContact(0).penetration_depth, distance,
492 tol);
493 4 }
494 4 }
495
496
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(sphere_box) {
497
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 Box* box_ptr = new coal::Box(1, 1, 1);
498
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionGeometryPtr_t b1(box_ptr);
499
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 BVHModel<OBBRSS> box_bvh_model = BVHModel<OBBRSS>();
500
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 generateBVHModel(box_bvh_model, *box_ptr, Transform3s());
501
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 box_bvh_model.buildConvexRepresentation(false);
502 2 ConvexBase& box_convex = *box_bvh_model.convex.get();
503
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 CollisionGeometryPtr_t s2(new coal::Sphere(0.5));
504
505
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Transform3s tf1;
506
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 const Transform3s tf2_collision(Vec3s(0, 0, 1));
507
508 2 const Scalar tol = Scalar(1e-6);
509
510
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 test_shape_shape(*b1.get(), tf1, *s2.get(), tf2_collision, tol);
511
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 test_shape_shape(box_convex, tf1, *s2.get(), tf2_collision, tol);
512 2 }
513