GCC Code Coverage Report


Directory: ./
File: test/contact_patch.cpp
Date: 2025-04-01 09:23:31
Exec Total Coverage
Lines: 649 675 96.1%
Branches: 1902 3794 50.1%

Line Branch Exec Source
1 /*
2 * Software License Agreement (BSD License)
3 *
4 * Copyright (c) 2024, 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 INRIA nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGE.
33 */
34
35 /** \author Louis Montaut */
36
37 #define BOOST_TEST_MODULE COAL_CONTACT_PATCH
38 #include <boost/test/included/unit_test.hpp>
39
40 #include "coal/contact_patch.h"
41
42 #include "utility.h"
43
44 using namespace coal;
45
46
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_no_collision) {
47 2 const Scalar halfside = Scalar(0.5);
48
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Box box1(2 * halfside, 2 * halfside, 2 * halfside);
49
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Box box2(2 * halfside, 2 * halfside, 2 * halfside);
50
51
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Transform3s tf1;
52
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Transform3s tf2;
53 // set translation to separate the shapes
54 2 const Scalar offset = Scalar(0.001);
55
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 tf2.setTranslation(Vec3s(0, 0, 2 * halfside + offset));
56
57 2 const size_t num_max_contact = 1;
58 const CollisionRequest col_req(CollisionRequestFlag::CONTACT,
59
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 num_max_contact);
60
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult col_res;
61
62
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::collide(&box1, tf1, &box2, tf2, col_req, col_res);
63
64
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(!col_res.isCollision());
65
66
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatchRequest patch_req;
67
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatchResult patch_res(patch_req);
68
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&box1, tf1, &box2, tf2, col_res, patch_req,
69 patch_res);
70
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(patch_res.numContactPatches() == 0);
71 2 }
72
73
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_sphere) {
74 2 const Scalar halfside = Scalar(0.5);
75
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Box box(2 * halfside, 2 * halfside, 2 * halfside);
76
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Sphere sphere(halfside);
77
78
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Transform3s tf1;
79
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Transform3s tf2;
80 // set translation to have a collision
81 2 const Scalar offset = Scalar(0.001);
82
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 tf2.setTranslation(Vec3s(0, 0, 2 * halfside - offset));
83
84 2 const size_t num_max_contact = 1;
85 const CollisionRequest col_req(CollisionRequestFlag::CONTACT,
86
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 num_max_contact);
87
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult col_res;
88
89
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::collide(&box, tf1, &sphere, tf2, col_req, col_res);
90
91
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(col_res.isCollision());
92
93
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatchRequest patch_req;
94
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatchResult patch_res(patch_req);
95
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&box, tf1, &sphere, tf2, col_res, patch_req,
96 patch_res);
97
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(patch_res.numContactPatches() == 1);
98
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 if (patch_res.numContactPatches() > 0 && col_res.isCollision()) {
99
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Contact &contact = col_res.getContact(0);
100
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatch &contact_patch = patch_res.getContactPatch(0);
101
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(contact_patch.size() == 1);
102 2 const Scalar tol = Scalar(1e-8);
103
18/36
✓ 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 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✗ Branch 63 not taken.
✓ Branch 64 taken 1 times.
2 EIGEN_VECTOR_IS_APPROX(contact_patch.getPoint(0), contact.pos, tol);
104
16/32
✓ 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 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 30 not taken.
✓ Branch 32 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 35 taken 1 times.
✗ Branch 36 not taken.
✓ Branch 39 taken 1 times.
✗ Branch 40 not taken.
✓ Branch 42 taken 1 times.
✗ Branch 43 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✗ Branch 59 not taken.
✓ Branch 60 taken 1 times.
2 EIGEN_VECTOR_IS_APPROX(contact_patch.tf.translation(), contact.pos, tol);
105
18/36
✓ 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 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✗ Branch 63 not taken.
✓ Branch 64 taken 1 times.
2 EIGEN_VECTOR_IS_APPROX(contact_patch.getNormal(), contact.normal, tol);
106
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(std::abs(contact_patch.penetration_depth -
107 contact.penetration_depth) < tol);
108 }
109 2 }
110
111
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) {
112 2 const Scalar halfside = 0.5;
113
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Box box1(2 * halfside, 2 * halfside, 2 * halfside);
114
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Box box2(2 * halfside, 2 * halfside, 2 * halfside);
115
116
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Transform3s tf1;
117
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Transform3s tf2;
118 // set translation to have a collision
119 2 const Scalar offset = Scalar(0.001);
120
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 tf2.setTranslation(Vec3s(0, 0, 2 * halfside - offset));
121
122 2 const size_t num_max_contact = 1;
123 const CollisionRequest col_req(CollisionRequestFlag::CONTACT,
124
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 num_max_contact);
125
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult col_res;
126
127
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::collide(&box1, tf1, &box2, tf2, col_req, col_res);
128
129
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(col_res.isCollision());
130
131
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatchRequest patch_req;
132
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatchResult patch_res1(patch_req);
133
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatchResult patch_res2(patch_req);
134
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&box1, tf1, &box2, tf2, col_res, patch_req,
135 patch_res1);
136
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&box1, tf1, &box2, tf2, col_res, patch_req,
137 patch_res2);
138
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(patch_res1.numContactPatches() == 1);
139
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(patch_res2.numContactPatches() == 1);
140
141
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 if (patch_res1.numContactPatches() > 0 &&
142
3/6
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
4 patch_res2.numContactPatches() > 0 && col_res.isCollision()) {
143
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Contact &contact = col_res.getContact(0);
144 2 const Scalar tol = Scalar(1e-6);
145
18/36
✓ 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 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✗ Branch 63 not taken.
✓ Branch 64 taken 1 times.
2 EIGEN_VECTOR_IS_APPROX(contact.normal, Vec3s(0, 0, 1), tol);
146
147 2 const size_t expected_size = 4;
148
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatch expected(expected_size);
149 2 expected.tf.rotation() =
150
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 constructOrthonormalBasisFromVector(contact.normal);
151
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 expected.tf.translation() = contact.pos;
152 2 expected.penetration_depth = contact.penetration_depth;
153 const std::array<Vec3s, 4> corners = {
154 Vec3s(halfside, halfside, halfside),
155 Vec3s(halfside, -halfside, halfside),
156 Vec3s(-halfside, -halfside, halfside),
157 Vec3s(-halfside, halfside, halfside),
158
4/8
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
2 };
159
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
10 for (size_t i = 0; i < expected_size; ++i) {
160
3/6
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 4 times.
✗ Branch 9 not taken.
8 expected.addPoint(corners[i] +
161
2/4
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
16 (contact.penetration_depth * contact.normal) / 2);
162 }
163
164
8/16
✓ 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 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
2 BOOST_CHECK(patch_res1.getContactPatch(0).isSame(expected, tol));
165
8/16
✓ 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 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
2 BOOST_CHECK(patch_res2.getContactPatch(0).isSame(expected, tol));
166 2 }
167 2 }
168
169
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(halfspace_box) {
170
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Halfspace hspace(0, 0, 1, 0);
171 2 const Scalar halfside = Scalar(0.5);
172
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Box box(2 * halfside, 2 * halfside, 2 * halfside);
173
174
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Transform3s tf1;
175
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Transform3s tf2;
176 // set translation to have a collision
177 2 const Scalar offset = Scalar(0.001);
178
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 tf2.setTranslation(Vec3s(0, 0, halfside - offset));
179
180 2 const size_t num_max_contact = 1;
181 const CollisionRequest col_req(CollisionRequestFlag::CONTACT,
182
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 num_max_contact);
183
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult col_res;
184
185
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::collide(&hspace, tf1, &box, tf2, col_req, col_res);
186
187
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(col_res.isCollision());
188
189
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatchRequest patch_req;
190
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatchResult patch_res1(patch_req);
191
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatchResult patch_res2(patch_req);
192
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&hspace, tf1, &box, tf2, col_res, patch_req,
193 patch_res1);
194
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&hspace, tf1, &box, tf2, col_res, patch_req,
195 patch_res2);
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(patch_res1.numContactPatches() == 1);
197
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(patch_res2.numContactPatches() == 1);
198
199
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 if (patch_res1.numContactPatches() > 0 &&
200
3/6
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
4 patch_res2.numContactPatches() > 0 && col_res.isCollision()) {
201
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Contact &contact = col_res.getContact(0);
202 2 const Scalar tol = Scalar(1e-6);
203
16/32
✓ 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 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
2 EIGEN_VECTOR_IS_APPROX(contact.normal, hspace.n, tol);
204
18/36
✓ 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 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✗ Branch 63 not taken.
✓ Branch 64 taken 1 times.
2 EIGEN_VECTOR_IS_APPROX(hspace.n, Vec3s(0, 0, 1), tol);
205
206 2 const size_t expected_size = 4;
207
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatch expected(expected_size);
208 2 expected.tf.rotation() =
209
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 constructOrthonormalBasisFromVector(contact.normal);
210
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 expected.tf.translation() = contact.pos;
211 2 expected.penetration_depth = contact.penetration_depth;
212 const std::array<Vec3s, 4> corners = {
213
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 tf2.transform(Vec3s(halfside, halfside, -halfside)),
214
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 tf2.transform(Vec3s(halfside, -halfside, -halfside)),
215
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 tf2.transform(Vec3s(-halfside, -halfside, -halfside)),
216
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 tf2.transform(Vec3s(-halfside, halfside, -halfside)),
217
4/8
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
8 };
218
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
10 for (size_t i = 0; i < expected_size; ++i) {
219
3/6
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 4 times.
✗ Branch 9 not taken.
8 expected.addPoint(corners[i] -
220
2/4
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
16 (contact.penetration_depth * contact.normal) / 2);
221 }
222
223
8/16
✓ 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 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
2 BOOST_CHECK(patch_res1.getContactPatch(0).isSame(expected, tol));
224
8/16
✓ 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 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
2 BOOST_CHECK(patch_res2.getContactPatch(0).isSame(expected, tol));
225 2 }
226 2 }
227
228
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(halfspace_capsule) {
229
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Halfspace hspace(0, 0, 1, 0);
230 2 const Scalar radius = Scalar(0.25);
231 2 const Scalar height = 1.;
232
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Capsule capsule(radius, height);
233
234
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Transform3s tf1;
235
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Transform3s tf2;
236 // set translation to have a collision
237 2 const Scalar offset = Scalar(0.001);
238
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 tf2.setTranslation(Vec3s(0, 0, height / 2 - offset));
239
240 2 const size_t num_max_contact = 1;
241 const CollisionRequest col_req(CollisionRequestFlag::CONTACT,
242
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 num_max_contact);
243
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult col_res;
244
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::collide(&hspace, tf1, &capsule, tf2, col_req, col_res);
245
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(col_res.isCollision());
246
247
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatchRequest patch_req;
248
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(patch_req.getNumSamplesCurvedShapes() ==
249 ContactPatch::default_preallocated_size);
250
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatchResult patch_res(patch_req);
251
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&hspace, tf1, &capsule, tf2, col_res, patch_req,
252 patch_res);
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(patch_res.numContactPatches() == 1);
254
255
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 if (patch_res.numContactPatches() > 0 && col_res.isCollision()) {
256
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Contact &contact = col_res.getContact(0);
257 2 const Scalar tol = Scalar(1e-6);
258
16/32
✓ 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 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
2 EIGEN_VECTOR_IS_APPROX(contact.normal, hspace.n, tol);
259
260 2 const size_t expected_size = 1;
261
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatch expected(expected_size);
262 2 expected.tf.rotation() =
263
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 constructOrthonormalBasisFromVector(contact.normal);
264
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 expected.tf.translation() = contact.pos;
265 2 expected.penetration_depth = contact.penetration_depth;
266
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Vec3s capsule_end(0, 0, -capsule.halfLength);
267
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 expected.addPoint(tf2.transform(capsule_end));
268
269
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatch &contact_patch = patch_res.getContactPatch(0);
270
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(expected.tf == contact_patch.tf);
271
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(expected.isSame(contact_patch, tol));
272 2 }
273
274 // Rotate capsule 180 degrees around y-axis
275 // Should only have one contact.
276
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 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.rotation().col(0) << -1, 0, 0;
277
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 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.rotation().col(1) << 0, 1, 0;
278
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 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.rotation().col(2) << 0, 0, -1;
279
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 col_res.clear();
280
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::collide(&hspace, tf1, &capsule, tf2, col_req, col_res);
281
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(col_res.isCollision());
282
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 patch_res.clear();
283
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&hspace, tf1, &capsule, tf2, col_res, patch_req,
284 patch_res);
285
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(patch_res.numContactPatches() == 1);
286
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 if (patch_res.numContactPatches() > 0 && col_res.isCollision()) {
287
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Contact &contact = col_res.getContact(0);
288 2 const Scalar tol = Scalar(1e-6);
289
16/32
✓ 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 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
2 EIGEN_VECTOR_IS_APPROX(contact.normal, hspace.n, tol);
290
291 2 const size_t expected_size = 1;
292
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatch expected(expected_size);
293 2 expected.tf.rotation() =
294
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 constructOrthonormalBasisFromVector(contact.normal);
295
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 expected.tf.translation() = contact.pos;
296 2 expected.penetration_depth = contact.penetration_depth;
297
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Vec3s capsule_end(0, 0, capsule.halfLength);
298
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 expected.addPoint(tf2.transform(capsule_end));
299
300
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatch &contact_patch = patch_res.getContactPatch(0);
301
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(expected.tf == contact_patch.tf);
302
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(expected.isSame(contact_patch, tol));
303 2 }
304
305 // Rotate cone 90 degrees around y-axis
306 // Should only have two contacts.
307
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 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.rotation().col(0) << 0, 0, 1;
308
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 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.rotation().col(1) << 0, 1, 0;
309
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 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.rotation().col(2) << -1, 0, 0;
310
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
2 tf2.translation() << 0, 0, capsule.radius - offset;
311
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 col_res.clear();
312
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::collide(&hspace, tf1, &capsule, tf2, col_req, col_res);
313
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(col_res.isCollision());
314
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 patch_res.clear();
315
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&hspace, tf1, &capsule, tf2, col_res, patch_req,
316 patch_res);
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(patch_res.numContactPatches() == 1);
318
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 if (patch_res.numContactPatches() > 0 && col_res.isCollision()) {
319
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Contact &contact = col_res.getContact(0);
320 2 const Scalar tol = Scalar(1e-6);
321
16/32
✓ 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 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
2 EIGEN_VECTOR_IS_APPROX(contact.normal, hspace.n, tol);
322
323 2 const size_t expected_size = 2;
324
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatch expected(expected_size);
325 2 expected.tf.rotation() =
326
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 constructOrthonormalBasisFromVector(contact.normal);
327
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 expected.tf.translation() = contact.pos;
328 2 expected.penetration_depth = contact.penetration_depth;
329
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Vec3s p1(-capsule.radius, 0, capsule.halfLength);
330
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Vec3s p2(-capsule.radius, 0, -capsule.halfLength);
331
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 expected.addPoint(tf2.transform(p1));
332
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 expected.addPoint(tf2.transform(p2));
333
334
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatch &contact_patch = patch_res.getContactPatch(0);
335
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(expected.tf == contact_patch.tf);
336
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(expected.isSame(contact_patch, tol));
337 2 }
338 2 }
339
340
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(halfspace_cone) {
341
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Halfspace hspace(0, 0, 1, 0);
342 2 const Scalar radius = 0.25;
343 2 const Scalar height = 1.;
344
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Cone cone(radius, height);
345
346
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Transform3s tf1;
347
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Transform3s tf2;
348 // set translation to have a collision
349 2 const Scalar offset = Scalar(0.001);
350
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 tf2.setTranslation(Vec3s(0, 0, height / 2 - offset));
351
352 2 const size_t num_max_contact = 1;
353 const CollisionRequest col_req(CollisionRequestFlag::CONTACT,
354
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 num_max_contact);
355
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult col_res;
356
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::collide(&hspace, tf1, &cone, tf2, col_req, col_res);
357
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(col_res.isCollision());
358
359
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatchRequest patch_req;
360
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(patch_req.getNumSamplesCurvedShapes() ==
361 ContactPatch::default_preallocated_size);
362
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatchResult patch_res(patch_req);
363
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&hspace, tf1, &cone, tf2, col_res, patch_req,
364 patch_res);
365
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(patch_res.numContactPatches() == 1);
366
367
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 if (patch_res.numContactPatches() > 0 && col_res.isCollision()) {
368
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Contact &contact = col_res.getContact(0);
369 2 const Scalar tol = Scalar(1e-6);
370
16/32
✓ 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 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
2 EIGEN_VECTOR_IS_APPROX(contact.normal, hspace.n, tol);
371
372 2 const size_t expected_size = ContactPatch::default_preallocated_size;
373
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatch expected(expected_size);
374 2 expected.tf.rotation() =
375
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 constructOrthonormalBasisFromVector(contact.normal);
376
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 expected.tf.translation() = contact.pos;
377 2 expected.penetration_depth = contact.penetration_depth;
378
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 std::array<Vec3s, ContactPatch::default_preallocated_size> points;
379 2 const Scalar angle_increment = 2.0 * (Scalar)(EIGEN_PI) / ((Scalar)(6));
380
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1 times.
26 for (size_t i = 0; i < ContactPatch::default_preallocated_size; ++i) {
381 24 const Scalar theta = (Scalar)(i)*angle_increment;
382 Vec3s point_on_cone_base(std::cos(theta) * cone.radius,
383
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
24 std::sin(theta) * cone.radius, -cone.halfLength);
384
2/4
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
24 expected.addPoint(tf2.transform(point_on_cone_base));
385 }
386
387
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatch &contact_patch = patch_res.getContactPatch(0);
388
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(expected.tf == contact_patch.tf);
389
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(expected.isSame(contact_patch, tol));
390 2 }
391
392 // Rotate cone 180 degrees around y-axis
393 // Should only have one contact, due to cone-tip/halfspace collision.
394
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 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.rotation().col(0) << -1, 0, 0;
395
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 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.rotation().col(1) << 0, 1, 0;
396
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 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.rotation().col(2) << 0, 0, -1;
397
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 col_res.clear();
398
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::collide(&hspace, tf1, &cone, tf2, col_req, col_res);
399
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(col_res.isCollision());
400
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 patch_res.clear();
401
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&hspace, tf1, &cone, tf2, col_res, patch_req,
402 patch_res);
403
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(patch_res.numContactPatches() == 1);
404
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 if (patch_res.numContactPatches() > 0 && col_res.isCollision()) {
405
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Contact &contact = col_res.getContact(0);
406
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatch &contact_patch = patch_res.getContactPatch(0);
407
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(contact_patch.size() == 1);
408 2 const Scalar tol = Scalar(1e-8);
409
18/36
✓ 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 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✗ Branch 63 not taken.
✓ Branch 64 taken 1 times.
2 EIGEN_VECTOR_IS_APPROX(contact_patch.getPoint(0), contact.pos, tol);
410
16/32
✓ 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 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 30 not taken.
✓ Branch 32 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 35 taken 1 times.
✗ Branch 36 not taken.
✓ Branch 39 taken 1 times.
✗ Branch 40 not taken.
✓ Branch 42 taken 1 times.
✗ Branch 43 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✗ Branch 59 not taken.
✓ Branch 60 taken 1 times.
2 EIGEN_VECTOR_IS_APPROX(contact_patch.tf.translation(), contact.pos, tol);
411
18/36
✓ 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 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✗ Branch 63 not taken.
✓ Branch 64 taken 1 times.
2 EIGEN_VECTOR_IS_APPROX(contact_patch.getNormal(), contact.normal, tol);
412
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(std::abs(contact_patch.penetration_depth -
413 contact.penetration_depth) < tol);
414
415 2 const size_t expected_size = 1;
416
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatch expected(expected_size);
417 2 expected.tf.rotation() =
418
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 constructOrthonormalBasisFromVector(contact.normal);
419
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 expected.tf.translation() = contact.pos;
420 2 expected.penetration_depth = contact.penetration_depth;
421
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Vec3s cone_tip(0, 0, cone.halfLength);
422
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 expected.addPoint(tf2.transform(cone_tip));
423
424
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(contact_patch.isSame(expected, tol));
425 2 }
426
427 // Rotate cone 90 degrees around y-axis
428 // Should only have one contact, on cone circle basis.
429
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 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.rotation().col(0) << 0, 0, 1;
430
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 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.rotation().col(1) << 0, 1, 0;
431
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 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.rotation().col(2) << -1, 0, 0;
432
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
2 tf2.translation() << 0, 0, cone.radius - offset;
433
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 col_res.clear();
434
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::collide(&hspace, tf1, &cone, tf2, col_req, col_res);
435
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(col_res.isCollision());
436
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 patch_res.clear();
437
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&hspace, tf1, &cone, tf2, col_res, patch_req,
438 patch_res);
439
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(patch_res.numContactPatches() == 1);
440
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 if (patch_res.numContactPatches() > 0 && col_res.isCollision()) {
441
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Contact &contact = col_res.getContact(0);
442
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatch &contact_patch = patch_res.getContactPatch(0);
443
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(contact_patch.size() == 1);
444 2 const Scalar tol = Scalar(1e-8);
445
18/36
✓ 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 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✗ Branch 63 not taken.
✓ Branch 64 taken 1 times.
2 EIGEN_VECTOR_IS_APPROX(contact_patch.getPoint(0), contact.pos, tol);
446
16/32
✓ 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 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 30 not taken.
✓ Branch 32 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 35 taken 1 times.
✗ Branch 36 not taken.
✓ Branch 39 taken 1 times.
✗ Branch 40 not taken.
✓ Branch 42 taken 1 times.
✗ Branch 43 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✗ Branch 59 not taken.
✓ Branch 60 taken 1 times.
2 EIGEN_VECTOR_IS_APPROX(contact_patch.tf.translation(), contact.pos, tol);
447
18/36
✓ 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 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✗ Branch 63 not taken.
✓ Branch 64 taken 1 times.
2 EIGEN_VECTOR_IS_APPROX(contact_patch.getNormal(), contact.normal, tol);
448
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(std::abs(contact_patch.penetration_depth -
449 contact.penetration_depth) < tol);
450
451 2 const size_t expected_size = 1;
452
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatch expected(expected_size);
453 2 expected.tf.rotation() =
454
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 constructOrthonormalBasisFromVector(contact.normal);
455
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 expected.tf.translation() = contact.pos;
456 2 expected.penetration_depth = contact.penetration_depth;
457
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Vec3s point_on_circle_basis(-cone.radius, 0, -cone.halfLength);
458
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 expected.addPoint(tf2.transform(point_on_circle_basis));
459
460
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(contact_patch.isSame(expected, tol));
461 2 }
462 2 }
463
464
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(halfspace_cylinder) {
465
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Halfspace hspace(0, 0, 1, 0);
466 2 const Scalar radius = Scalar(0.25);
467 2 const Scalar height = 1;
468
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Cylinder cylinder(radius, height);
469
470
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Transform3s tf1;
471
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Transform3s tf2;
472 // set translation to have a collision
473 2 const Scalar offset = Scalar(0.001);
474
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 tf2.setTranslation(Vec3s(0, 0, height / 2 - offset));
475
476 2 const size_t num_max_contact = 1;
477 const CollisionRequest col_req(CollisionRequestFlag::CONTACT,
478
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 num_max_contact);
479
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult col_res;
480
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::collide(&hspace, tf1, &cylinder, tf2, col_req, col_res);
481
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(col_res.isCollision());
482
483
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 if (col_res.isCollision()) {
484
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Contact &contact = col_res.getContact(0);
485 2 const size_t expected_size = ContactPatch::default_preallocated_size;
486 2 const Scalar tol = Scalar(1e-6);
487
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatch expected(expected_size);
488 2 expected.tf.rotation() =
489
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 constructOrthonormalBasisFromVector(contact.normal);
490
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 expected.tf.translation() = contact.pos;
491 2 expected.penetration_depth = contact.penetration_depth;
492
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 std::array<Vec3s, ContactPatch::default_preallocated_size> points;
493 2 const Scalar angle_increment = 2.0 * (Scalar)(EIGEN_PI) / ((Scalar)(6));
494
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1 times.
26 for (size_t i = 0; i < ContactPatch::default_preallocated_size; ++i) {
495 24 const Scalar theta = (Scalar)(i)*angle_increment;
496 Vec3s point_on_cone_base(std::cos(theta) * cylinder.radius,
497 std::sin(theta) * cylinder.radius,
498
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
24 -cylinder.halfLength);
499
2/4
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
24 expected.addPoint(tf2.transform(point_on_cone_base));
500 }
501
502
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatchRequest patch_req;
503
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(patch_req.getNumSamplesCurvedShapes() ==
504 ContactPatch::default_preallocated_size);
505
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatchResult patch_res(patch_req);
506
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&hspace, tf1, &cylinder, tf2, col_res, patch_req,
507 patch_res);
508
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(patch_res.numContactPatches() == 1);
509
510
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 if (patch_res.numContactPatches() > 0) {
511
16/32
✓ 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 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
2 EIGEN_VECTOR_IS_APPROX(contact.normal, hspace.n, tol);
512
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatch &contact_patch = patch_res.getContactPatch(0);
513
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(expected.tf == contact_patch.tf);
514
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(expected.isSame(contact_patch, tol));
515 }
516
517 // Rotate cylinder 180 degrees around y-axis.
518 // Should only have the same contact-patch, due to cylinder symmetry.
519
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 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.rotation().col(0) << -1, 0, 0;
520
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 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.rotation().col(1) << 0, 1, 0;
521
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 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.rotation().col(2) << 0, 0, -1;
522
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 col_res.clear();
523
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::collide(&hspace, tf1, &cylinder, tf2, col_req, col_res);
524
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(col_res.isCollision());
525
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 patch_res.clear();
526
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&hspace, tf1, &cylinder, tf2, col_res, patch_req,
527 patch_res);
528
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(patch_res.numContactPatches() == 1);
529
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 if (patch_res.numContactPatches() > 0 && col_res.isCollision()) {
530
16/32
✓ 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 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
2 EIGEN_VECTOR_IS_APPROX(contact.normal, hspace.n, tol);
531
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatch &contact_patch = patch_res.getContactPatch(0);
532
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(expected.tf == contact_patch.tf);
533
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(expected.isSame(contact_patch, tol));
534 }
535 2 }
536
537 // Rotate cylinder 90 degrees around y-axis.
538 // Should have 2 contact points.
539
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 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.rotation().col(0) << 0, 0, 1;
540
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 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.rotation().col(1) << 0, 1, 0;
541
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 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.rotation().col(2) << -1, 0, 0;
542
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
2 tf2.translation() << 0, 0, cylinder.radius - offset;
543
544
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 col_res.clear();
545
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::collide(&hspace, tf1, &cylinder, tf2, col_req, col_res);
546
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(col_res.isCollision());
547
548
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatchRequest patch_req;
549
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatchResult patch_res(patch_req);
550
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&hspace, tf1, &cylinder, tf2, col_res, patch_req,
551 patch_res);
552
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(patch_res.numContactPatches() == 1);
553
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 if (col_res.isCollision() && patch_res.numContactPatches() > 0) {
554
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Contact &contact = col_res.getContact(0);
555 2 const Scalar tol = Scalar(1e-6);
556
557 2 const size_t expected_size = 2;
558
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatch expected(expected_size);
559 2 expected.tf.rotation() =
560
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 constructOrthonormalBasisFromVector(contact.normal);
561
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 expected.tf.translation() = contact.pos;
562 2 expected.penetration_depth = contact.penetration_depth;
563
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 expected.addPoint(
564
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 tf2.transform(Vec3s(cylinder.radius, 0, cylinder.halfLength)));
565
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 expected.addPoint(
566
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 tf2.transform(Vec3s(cylinder.radius, 0, -cylinder.halfLength)));
567
568
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatch &contact_patch = patch_res.getContactPatch(0);
569
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(expected.isSame(contact_patch, tol));
570 2 }
571 2 }
572
573
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(convex_convex) {
574 2 const Scalar halfside = 0.5;
575
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Convex<Quadrilateral> box1(buildBox(halfside, halfside, halfside));
576
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Convex<Quadrilateral> box2(buildBox(halfside, halfside, halfside));
577
578
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Transform3s tf1;
579
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Transform3s tf2;
580 // set translation to have a collision
581 2 const Scalar offset = Scalar(0.001);
582
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 tf2.setTranslation(Vec3s(0, 0, 2 * halfside - offset));
583
584 2 const size_t num_max_contact = 1;
585 const CollisionRequest col_req(CollisionRequestFlag::CONTACT,
586
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 num_max_contact);
587
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult col_res;
588
589
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::collide(&box1, tf1, &box2, tf2, col_req, col_res);
590
591
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(col_res.isCollision());
592
593
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatchRequest patch_req;
594
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatchResult patch_res1(patch_req);
595
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatchResult patch_res2(patch_req);
596
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&box1, tf1, &box2, tf2, col_res, patch_req,
597 patch_res1);
598
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&box1, tf1, &box2, tf2, col_res, patch_req,
599 patch_res2);
600
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(patch_res1.numContactPatches() == 1);
601
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(patch_res2.numContactPatches() == 1);
602
603
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 if (patch_res1.numContactPatches() > 0 &&
604
3/6
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
4 patch_res2.numContactPatches() > 0 && col_res.isCollision()) {
605
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Contact &contact = col_res.getContact(0);
606 2 const Scalar tol = Scalar(1e-6);
607
18/36
✓ 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 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✗ Branch 63 not taken.
✓ Branch 64 taken 1 times.
2 EIGEN_VECTOR_IS_APPROX(contact.normal, Vec3s(0, 0, 1), tol);
608
609 2 const size_t expected_size = 4;
610
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatch expected(expected_size);
611 2 expected.tf.rotation() =
612
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 constructOrthonormalBasisFromVector(contact.normal);
613
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 expected.tf.translation() = contact.pos;
614 2 expected.penetration_depth = contact.penetration_depth;
615 const std::array<Vec3s, 4> corners = {
616 Vec3s(halfside, halfside, halfside),
617 Vec3s(halfside, -halfside, halfside),
618 Vec3s(-halfside, -halfside, halfside),
619 Vec3s(-halfside, halfside, halfside),
620
4/8
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
2 };
621
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
10 for (size_t i = 0; i < expected_size; ++i) {
622
3/6
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 4 times.
✗ Branch 9 not taken.
8 expected.addPoint(corners[i] +
623
2/4
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
16 (contact.penetration_depth * contact.normal) / 2);
624 }
625
626
8/16
✓ 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 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
2 BOOST_CHECK(patch_res1.getContactPatch(0).isSame(expected, tol));
627
8/16
✓ 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 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
2 BOOST_CHECK(patch_res2.getContactPatch(0).isSame(expected, tol));
628 2 }
629 2 }
630
631
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(edge_case_segment_segment) {
632 // This case covers the segment-segment edge case of contact patches.
633 // Two tetrahedrons make contact on one of their edge.
634
635 2 const size_t expected_size = 2;
636
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Vec3s expected_cp1(0, 0.5, 0);
637
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Vec3s expected_cp2(0, 1, 0);
638
639
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Transform3s tf1; // identity
640
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Transform3s tf2; // identity
641
642 2 const size_t num_max_contact = 1;
643 const CollisionRequest col_req(CollisionRequestFlag::CONTACT,
644
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 num_max_contact);
645
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult col_res;
646
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatchRequest patch_req;
647
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatchResult patch_res(patch_req);
648
649 {
650 // Case 1 - Face-Face contact
651 std::shared_ptr<std::vector<Vec3s>> pts1(new std::vector<Vec3s>({
652 Vec3s(-1, 0, 0),
653 Vec3s(0, 0, 0),
654 Vec3s(0, 1, 0),
655 Vec3s(-1, -1, -1),
656
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 }));
657 std::shared_ptr<std::vector<Triangle>> tris1(
658 new std::vector<Triangle>({Triangle(0, 1, 2), Triangle(0, 2, 3),
659
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 Triangle(0, 3, 1), Triangle(2, 1, 3)}));
660
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
4 Convex<Triangle> tetra1(pts1, 4, tris1, 4);
661
662 std::shared_ptr<std::vector<Vec3s>> pts2(new std::vector<Vec3s>({
663 Vec3s(0, 0.5, 0),
664 Vec3s(0, 1.5, 0),
665 Vec3s(1, 0.5, 0),
666 Vec3s(1, 1, 1),
667
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 }));
668 std::shared_ptr<std::vector<Triangle>> tris2(
669 new std::vector<Triangle>({Triangle(0, 1, 2), Triangle(0, 2, 3),
670
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 Triangle(0, 3, 1), Triangle(2, 1, 3)}));
671
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
4 Convex<Triangle> tetra2(pts2, 4, tris2, 4);
672
673
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 col_res.clear();
674
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::collide(&tetra1, tf1, &tetra2, tf2, col_req, col_res);
675
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(col_res.isCollision());
676
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 patch_res.clear();
677
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&tetra1, tf1, &tetra2, tf2, col_res, patch_req,
678 patch_res);
679
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(patch_res.numContactPatches() == 1);
680
681
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 if (patch_res.numContactPatches() > 0) {
682
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Contact &contact = col_res.getContact(0);
683 2 const Scalar tol = Scalar(1e-6);
684
685
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatch expected(expected_size);
686 // GJK/EPA can return any normal which is in the dual cone
687 // of the cone {(-1, 0, 0)}.
688 2 expected.tf.rotation() =
689
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 constructOrthonormalBasisFromVector(contact.normal);
690
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 expected.tf.translation() = contact.pos;
691 2 expected.penetration_depth = contact.penetration_depth;
692
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 expected.addPoint(expected_cp1);
693
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 expected.addPoint(expected_cp2);
694
695
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatch &contact_patch = patch_res.getContactPatch(0);
696
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(expected.isSame(contact_patch, tol));
697 2 }
698 2 }
699
700 {
701 // Case 2 - Face-Segment contact
702 std::shared_ptr<std::vector<Vec3s>> pts1(new std::vector<Vec3s>({
703 Vec3s(-1, 0, Scalar(-0.2)),
704 Vec3s(0, 0, 0),
705 Vec3s(0, 1, 0),
706 Vec3s(-1, -1, -1),
707
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 }));
708 std::shared_ptr<std::vector<Triangle>> tris1(
709 new std::vector<Triangle>({Triangle(0, 1, 2), Triangle(0, 2, 3),
710
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 Triangle(0, 3, 1), Triangle(2, 1, 3)}));
711
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
4 Convex<Triangle> tetra1(pts1, 4, tris1, 4);
712
713 std::shared_ptr<std::vector<Vec3s>> pts2(new std::vector<Vec3s>({
714 Vec3s(0, 0.5, 0),
715 Vec3s(0, 1.5, 0),
716 Vec3s(1, 0.5, 0),
717 Vec3s(1, 1, 1),
718
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 }));
719 std::shared_ptr<std::vector<Triangle>> tris2(
720 new std::vector<Triangle>({Triangle(0, 1, 2), Triangle(0, 2, 3),
721
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 Triangle(0, 3, 1), Triangle(2, 1, 3)}));
722
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
4 Convex<Triangle> tetra2(pts2, 4, tris2, 4);
723
724
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 col_res.clear();
725
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::collide(&tetra1, tf1, &tetra2, tf2, col_req, col_res);
726
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(col_res.isCollision());
727
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 patch_res.clear();
728
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&tetra1, tf1, &tetra2, tf2, col_res, patch_req,
729 patch_res);
730
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(patch_res.numContactPatches() == 1);
731
732
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 if (patch_res.numContactPatches() > 0) {
733
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Contact &contact = col_res.getContact(0);
734 2 const Scalar tol = Scalar(1e-6);
735
736
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatch expected(expected_size);
737 2 expected.tf.rotation() =
738
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 constructOrthonormalBasisFromVector(contact.normal);
739
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 expected.tf.translation() = contact.pos;
740 2 expected.penetration_depth = contact.penetration_depth;
741
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 expected.addPoint(expected_cp1);
742
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 expected.addPoint(expected_cp2);
743
744
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatch &contact_patch = patch_res.getContactPatch(0);
745
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(expected.isSame(contact_patch, tol));
746 2 }
747 2 }
748
749 {
750 // Case 3 - Segment-Segment contact
751 std::shared_ptr<std::vector<Vec3s>> pts1(new std::vector<Vec3s>({
752 Vec3s(-1, 0, Scalar(-0.2)),
753 Vec3s(0, 0, 0),
754 Vec3s(0, 1, 0),
755 Vec3s(-1, -1, -1),
756
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 }));
757 std::shared_ptr<std::vector<Triangle>> tris1(
758 new std::vector<Triangle>({Triangle(0, 1, 2), Triangle(0, 2, 3),
759
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 Triangle(0, 3, 1), Triangle(2, 1, 3)}));
760
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
4 Convex<Triangle> tetra1(pts1, 4, tris1, 4);
761
762 std::shared_ptr<std::vector<Vec3s>> pts2(new std::vector<Vec3s>({
763 Vec3s(0, 0.5, 0),
764 Vec3s(0, 1.5, 0),
765 Vec3s(1, 0.5, 0.5),
766 Vec3s(1, 1, 1),
767
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 }));
768 std::shared_ptr<std::vector<Triangle>> tris2(
769 new std::vector<Triangle>({Triangle(0, 1, 2), Triangle(0, 2, 3),
770
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 Triangle(0, 3, 1), Triangle(2, 1, 3)}));
771
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
4 Convex<Triangle> tetra2(pts2, 4, tris2, 4);
772
773
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 col_res.clear();
774
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::collide(&tetra1, tf1, &tetra2, tf2, col_req, col_res);
775
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(col_res.isCollision());
776
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 patch_res.clear();
777
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&tetra1, tf1, &tetra2, tf2, col_res, patch_req,
778 patch_res);
779
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(patch_res.numContactPatches() == 1);
780
781
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 if (patch_res.numContactPatches() > 0) {
782
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Contact &contact = col_res.getContact(0);
783 2 const Scalar tol = Scalar(1e-6);
784
785
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatch expected(expected_size);
786 2 expected.tf.rotation() =
787
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 constructOrthonormalBasisFromVector(contact.normal);
788
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 expected.tf.translation() = contact.pos;
789 2 expected.penetration_depth = contact.penetration_depth;
790
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 expected.addPoint(expected_cp1);
791
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 expected.addPoint(expected_cp2);
792
793
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatch &contact_patch = patch_res.getContactPatch(0);
794
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(expected.isSame(contact_patch, tol));
795 2 }
796 2 }
797 2 }
798
799
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(edge_case_vertex_vertex) {
800 // This case covers the vertex-vertex edge case of contact patches.
801 // Two tetrahedrons make contact on one of their vertex.
802 2 const size_t expected_size = 1;
803
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Vec3s expected_cp(0, 0, 0);
804
805
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Transform3s tf1; // identity
806
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Transform3s tf2; // identity
807
808 2 const size_t num_max_contact = 1;
809 const CollisionRequest col_req(CollisionRequestFlag::CONTACT,
810
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 num_max_contact);
811
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult col_res;
812
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatchRequest patch_req;
813
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatchResult patch_res(patch_req);
814
815 {
816 // Case 1 - Face-Face contact
817 std::shared_ptr<std::vector<Vec3s>> pts1(new std::vector<Vec3s>({
818 Vec3s(-1, 0, 0),
819 Vec3s(0, 0, 0),
820 Vec3s(0, 1, 0),
821 Vec3s(-1, -1, -1),
822
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 }));
823 std::shared_ptr<std::vector<Triangle>> tris1(
824 new std::vector<Triangle>({Triangle(0, 1, 2), Triangle(0, 2, 3),
825
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 Triangle(0, 3, 1), Triangle(2, 1, 3)}));
826
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
4 Convex<Triangle> tetra1(pts1, 4, tris1, 4);
827
828 std::shared_ptr<std::vector<Vec3s>> pts2(new std::vector<Vec3s>({
829 Vec3s(1, 0, 0),
830 Vec3s(0, 0, 0),
831 Vec3s(0, -1, 0),
832 Vec3s(1, 1, 1),
833
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 }));
834 std::shared_ptr<std::vector<Triangle>> tris2(
835 new std::vector<Triangle>({Triangle(0, 1, 2), Triangle(0, 2, 3),
836
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 Triangle(0, 3, 1), Triangle(2, 1, 3)}));
837
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
4 Convex<Triangle> tetra2(pts2, 4, tris2, 4);
838
839
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 col_res.clear();
840
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::collide(&tetra1, tf1, &tetra2, tf2, col_req, col_res);
841
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(col_res.isCollision());
842
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 patch_res.clear();
843
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&tetra1, tf1, &tetra2, tf2, col_res, patch_req,
844 patch_res);
845
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(patch_res.numContactPatches() == 1);
846
847
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 if (patch_res.numContactPatches() > 0) {
848
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Contact &contact = col_res.getContact(0);
849 2 const Scalar tol = Scalar(1e-6);
850
851
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatch expected(expected_size);
852 2 expected.tf.rotation() =
853
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 constructOrthonormalBasisFromVector(contact.normal);
854
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 expected.tf.translation() = contact.pos;
855 2 expected.penetration_depth = contact.penetration_depth;
856
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 expected.addPoint(expected_cp);
857
858
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatch &contact_patch = patch_res.getContactPatch(0);
859
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(expected.isSame(contact_patch, tol));
860 2 }
861 2 }
862
863 {
864 // Case 2 - Segment-Face contact
865 std::shared_ptr<std::vector<Vec3s>> pts1(new std::vector<Vec3s>({
866 Vec3s(-1, 0, -0.5),
867 Vec3s(0, 0, 0),
868 Vec3s(0, 1, 0),
869 Vec3s(-1, -1, -1),
870
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 }));
871 std::shared_ptr<std::vector<Triangle>> tris1(
872 new std::vector<Triangle>({Triangle(0, 1, 2), Triangle(0, 2, 3),
873
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 Triangle(0, 3, 1), Triangle(2, 1, 3)}));
874
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
4 Convex<Triangle> tetra1(pts1, 4, tris1, 4);
875
876 std::shared_ptr<std::vector<Vec3s>> pts2(new std::vector<Vec3s>({
877 Vec3s(1, 0, 0),
878 Vec3s(0, 0, 0),
879 Vec3s(0, -1, 0),
880 Vec3s(1, 1, 1),
881
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 }));
882 std::shared_ptr<std::vector<Triangle>> tris2(
883 new std::vector<Triangle>({Triangle(0, 1, 2), Triangle(0, 2, 3),
884
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 Triangle(0, 3, 1), Triangle(2, 1, 3)}));
885
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
4 Convex<Triangle> tetra2(pts2, 4, tris2, 4);
886
887
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 col_res.clear();
888
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::collide(&tetra1, tf1, &tetra2, tf2, col_req, col_res);
889
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(col_res.isCollision());
890
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 patch_res.clear();
891
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&tetra1, tf1, &tetra2, tf2, col_res, patch_req,
892 patch_res);
893
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(patch_res.numContactPatches() == 1);
894
895
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 if (patch_res.numContactPatches() > 0) {
896
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Contact &contact = col_res.getContact(0);
897 2 const Scalar tol = Scalar(1e-6);
898
899
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatch expected(expected_size);
900 2 expected.tf.rotation() =
901
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 constructOrthonormalBasisFromVector(contact.normal);
902
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 expected.tf.translation() = contact.pos;
903 2 expected.penetration_depth = contact.penetration_depth;
904
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 expected.addPoint(expected_cp);
905
906
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatch &contact_patch = patch_res.getContactPatch(0);
907
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(expected.isSame(contact_patch, tol));
908 2 }
909 2 }
910
911 {
912 // Case 2 - Segment-Segment contact
913 std::shared_ptr<std::vector<Vec3s>> pts1(new std::vector<Vec3s>({
914 Vec3s(-1, 0, Scalar(-0.2)),
915 Vec3s(0, 0, 0),
916 Vec3s(0, 1, 0),
917 Vec3s(-1, -1, -1),
918
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 }));
919 std::shared_ptr<std::vector<Triangle>> tris1(
920 new std::vector<Triangle>({Triangle(0, 1, 2), Triangle(0, 2, 3),
921
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 Triangle(0, 3, 1), Triangle(2, 1, 3)}));
922
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
4 Convex<Triangle> tetra1(pts1, 4, tris1, 4);
923
924 std::shared_ptr<std::vector<Vec3s>> pts2(new std::vector<Vec3s>({
925 Vec3s(1, 0, 0),
926 Vec3s(0, 0, 0),
927 Vec3s(0, -1, 0.5),
928 Vec3s(1, 1, 1),
929
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 }));
930 std::shared_ptr<std::vector<Triangle>> tris2(
931 new std::vector<Triangle>({Triangle(0, 1, 2), Triangle(0, 2, 3),
932
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 Triangle(0, 3, 1), Triangle(2, 1, 3)}));
933
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
4 Convex<Triangle> tetra2(pts2, 4, tris2, 4);
934
935
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 col_res.clear();
936
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::collide(&tetra1, tf1, &tetra2, tf2, col_req, col_res);
937
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(col_res.isCollision());
938
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 patch_res.clear();
939
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&tetra1, tf1, &tetra2, tf2, col_res, patch_req,
940 patch_res);
941
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(patch_res.numContactPatches() == 1);
942
943
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 if (patch_res.numContactPatches() > 0) {
944
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Contact &contact = col_res.getContact(0);
945 2 const Scalar tol = Scalar(1e-6);
946
947
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatch expected(expected_size);
948 2 expected.tf.rotation() =
949
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 constructOrthonormalBasisFromVector(contact.normal);
950
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 expected.tf.translation() = contact.pos;
951 2 expected.penetration_depth = contact.penetration_depth;
952
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 expected.addPoint(expected_cp);
953
954
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatch &contact_patch = patch_res.getContactPatch(0);
955
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(expected.isSame(contact_patch, tol));
956 2 }
957 2 }
958 2 }
959
960
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(edge_case_segment_face) {
961 // This case covers the segment-face edge case of contact patches.
962 // Two tetrahedrons make contact on one of their segment/face respectively.
963 2 const size_t expected_size = 2;
964
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Vec3s expected_cp1(0, 0, 0);
965
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Vec3s expected_cp2(-0.5, 0.5, 0);
966
967
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Transform3s tf1; // identity
968
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Transform3s tf2; // identity
969
970 2 const size_t num_max_contact = 1;
971 const CollisionRequest col_req(CollisionRequestFlag::CONTACT,
972
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 num_max_contact);
973
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CollisionResult col_res;
974
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatchRequest patch_req;
975
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatchResult patch_res(patch_req);
976
977 {
978 std::shared_ptr<std::vector<Vec3s>> pts1(new std::vector<Vec3s>({
979 Vec3s(-1, 0, -0),
980 Vec3s(0, 0, 0),
981 Vec3s(0, 1, 0),
982 Vec3s(-1, -1, -1),
983
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 }));
984 std::shared_ptr<std::vector<Triangle>> tris1(
985 new std::vector<Triangle>({Triangle(0, 1, 2), Triangle(0, 2, 3),
986
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 Triangle(0, 3, 1), Triangle(2, 1, 3)}));
987
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
4 Convex<Triangle> tetra1(pts1, 4, tris1, 4);
988
989 std::shared_ptr<std::vector<Vec3s>> pts2(new std::vector<Vec3s>({
990 Vec3s(-0.5, 0.5, 0),
991 Vec3s(0.5, -0.5, 0),
992 Vec3s(1, 0.5, 0.5),
993 Vec3s(1, 1, 1),
994
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 }));
995 std::shared_ptr<std::vector<Triangle>> tris2(
996 new std::vector<Triangle>({Triangle(0, 1, 2), Triangle(0, 2, 3),
997
7/14
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 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.
2 Triangle(0, 3, 1), Triangle(2, 1, 3)}));
998
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
4 Convex<Triangle> tetra2(pts2, 4, tris2, 4);
999
1000
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 col_res.clear();
1001
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::collide(&tetra1, tf1, &tetra2, tf2, col_req, col_res);
1002
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(col_res.isCollision());
1003
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 patch_res.clear();
1004
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 coal::computeContactPatch(&tetra1, tf1, &tetra2, tf2, col_res, patch_req,
1005 patch_res);
1006
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(patch_res.numContactPatches() == 1);
1007
1008
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 if (patch_res.numContactPatches() > 0) {
1009
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const Contact &contact = col_res.getContact(0);
1010 2 const Scalar tol = Scalar(1e-6);
1011
1012
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ContactPatch expected(expected_size);
1013 2 expected.tf.rotation() =
1014
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 constructOrthonormalBasisFromVector(contact.normal);
1015
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 expected.tf.translation() = contact.pos;
1016 2 expected.penetration_depth = contact.penetration_depth;
1017
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 expected.addPoint(expected_cp1);
1018
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 expected.addPoint(expected_cp2);
1019
1020
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const ContactPatch &contact_patch = patch_res.getContactPatch(0);
1021
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(expected.isSame(contact_patch, tol));
1022 2 }
1023 2 }
1024 2 }
1025