Directory: | ./ |
---|---|
File: | test/convex.cpp |
Date: | 2025-04-01 09:23:31 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 73 | 73 | 100.0% |
Branches: | 329 | 650 | 50.6% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | * Software License Agreement (BSD License) | ||
3 | * | ||
4 | * Copyright (c) 2019, LAAS-CNRS | ||
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 Open Source Robotics Foundation 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 Joseph Mirabel */ | ||
36 | |||
37 | #define BOOST_TEST_MODULE COAL_GEOMETRIC_SHAPES | ||
38 | #include <boost/test/included/unit_test.hpp> | ||
39 | |||
40 | #include "coal/shape/convex.h" | ||
41 | #include "coal/collision.h" | ||
42 | #include "coal/distance.h" | ||
43 | |||
44 | #include "utility.h" | ||
45 | |||
46 | using namespace coal; | ||
47 | |||
48 |
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) { |
49 | 2 | Scalar l = 1, w = 1, d = 1; | |
50 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | Convex<Quadrilateral> box(buildBox(l, w, d)); |
51 | |||
52 | // Check neighbors | ||
53 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 1 times.
|
18 | for (size_t i = 0; i < 8; ++i) { |
54 |
5/10✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 8 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 8 times.
|
16 | BOOST_CHECK_EQUAL((*box.neighbors)[i].count(), 3); |
55 | } | ||
56 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[0][0], 1); |
57 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[0][1], 2); |
58 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[0][2], 4); |
59 | |||
60 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[1][0], 0); |
61 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[1][1], 3); |
62 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[1][2], 5); |
63 | |||
64 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[2][0], 0); |
65 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[2][1], 3); |
66 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[2][2], 6); |
67 | |||
68 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[3][0], 1); |
69 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[3][1], 2); |
70 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[3][2], 7); |
71 | |||
72 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[4][0], 0); |
73 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[4][1], 5); |
74 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[4][2], 6); |
75 | |||
76 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[5][0], 1); |
77 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[5][1], 4); |
78 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[5][2], 7); |
79 | |||
80 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[6][0], 2); |
81 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[6][1], 4); |
82 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[6][2], 7); |
83 | |||
84 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[7][0], 3); |
85 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[7][1], 5); |
86 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
|
2 | BOOST_CHECK_EQUAL((*box.neighbors)[7][2], 6); |
87 | 2 | } | |
88 | |||
89 | template <typename Sa, typename Sb> | ||
90 | 1002 | void compareShapeIntersection(const Sa& sa, const Sb& sb, | |
91 | const Transform3s& tf1, const Transform3s& tf2, | ||
92 | Scalar tol = Scalar(1e-9)) { | ||
93 |
1/2✓ Branch 2 taken 1002 times.
✗ Branch 3 not taken.
|
1002 | CollisionRequest request(CONTACT | DISTANCE_LOWER_BOUND, 1); |
94 |
2/4✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1002 times.
✗ Branch 5 not taken.
|
1002 | CollisionResult resA, resB; |
95 | |||
96 |
1/2✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
|
1002 | collide(&sa, tf1, &sa, tf2, request, resA); |
97 |
1/2✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
|
1002 | collide(&sb, tf1, &sb, tf2, request, resB); |
98 | |||
99 |
5/10✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1002 times.
✗ Branch 6 not taken.
✓ Branch 12 taken 1002 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 1002 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 1002 times.
|
1002 | BOOST_CHECK_EQUAL(resA.isCollision(), resB.isCollision()); |
100 |
5/10✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1002 times.
✗ Branch 6 not taken.
✓ Branch 12 taken 1002 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 1002 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 1002 times.
|
1002 | BOOST_CHECK_EQUAL(resA.numContacts(), resB.numContacts()); |
101 | |||
102 |
5/6✓ Branch 1 taken 9 times.
✓ Branch 2 taken 993 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✓ Branch 7 taken 993 times.
|
1002 | if (resA.isCollision() && resB.isCollision()) { |
103 |
4/8✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 9 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 9 times.
✗ Branch 11 not taken.
|
9 | Contact cA = resA.getContact(0), cB = resB.getContact(0); |
104 | |||
105 |
15/30✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 9 times.
✗ Branch 9 not taken.
✓ Branch 12 taken 9 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 9 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 9 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 9 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 9 times.
✗ Branch 25 not taken.
✓ Branch 27 taken 9 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 9 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 9 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 9 times.
✗ Branch 37 not taken.
✓ Branch 39 taken 9 times.
✗ Branch 40 not taken.
✓ Branch 42 taken 9 times.
✗ Branch 43 not taken.
✓ Branch 45 taken 9 times.
✗ Branch 46 not taken.
|
9 | BOOST_TEST_MESSAGE(tf1 << '\n' |
106 | << cA.pos.format(pyfmt) << '\n' | ||
107 | << '\n' | ||
108 | << tf2 << '\n' | ||
109 | << cB.pos.format(pyfmt) << '\n'); | ||
110 | // Only warnings because there are still some bugs. | ||
111 |
7/14✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 9 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 9 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 9 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 9 times.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 9 times.
|
9 | BOOST_WARN_SMALL((cA.pos - cB.pos).squaredNorm(), tol); |
112 |
7/14✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 9 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 9 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 9 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 9 times.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 9 times.
|
9 | BOOST_WARN_SMALL((cA.normal - cB.normal).squaredNorm(), tol); |
113 | } else { | ||
114 |
6/12✓ Branch 1 taken 993 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 993 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 993 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 993 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 993 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 993 times.
|
993 | BOOST_CHECK_CLOSE(resA.distance_lower_bound, resB.distance_lower_bound, |
115 | tol); // distances should be same | ||
116 | } | ||
117 | 1002 | } | |
118 | |||
119 | template <typename Sa, typename Sb> | ||
120 | 1002 | void compareShapeDistance(const Sa& sa, const Sb& sb, const Transform3s& tf1, | |
121 | const Transform3s& tf2, Scalar tol = Scalar(1e-9)) { | ||
122 |
1/2✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
|
1002 | DistanceRequest request(true); |
123 |
2/4✓ Branch 2 taken 1002 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1002 times.
✗ Branch 7 not taken.
|
1002 | DistanceResult resA, resB; |
124 | |||
125 |
1/2✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
|
1002 | distance(&sa, tf1, &sa, tf2, request, resA); |
126 |
1/2✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
|
1002 | distance(&sb, tf1, &sb, tf2, request, resB); |
127 | |||
128 |
27/54✓ Branch 2 taken 1002 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1002 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1002 times.
✗ Branch 9 not taken.
✓ Branch 12 taken 1002 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 1002 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1002 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1002 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 1002 times.
✗ Branch 25 not taken.
✓ Branch 28 taken 1002 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1002 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1002 times.
✗ Branch 35 not taken.
✓ Branch 38 taken 1002 times.
✗ Branch 39 not taken.
✓ Branch 41 taken 1002 times.
✗ Branch 42 not taken.
✓ Branch 44 taken 1002 times.
✗ Branch 45 not taken.
✓ Branch 47 taken 1002 times.
✗ Branch 48 not taken.
✓ Branch 50 taken 1002 times.
✗ Branch 51 not taken.
✓ Branch 53 taken 1002 times.
✗ Branch 54 not taken.
✓ Branch 56 taken 1002 times.
✗ Branch 57 not taken.
✓ Branch 59 taken 1002 times.
✗ Branch 60 not taken.
✓ Branch 62 taken 1002 times.
✗ Branch 63 not taken.
✓ Branch 66 taken 1002 times.
✗ Branch 67 not taken.
✓ Branch 69 taken 1002 times.
✗ Branch 70 not taken.
✓ Branch 72 taken 1002 times.
✗ Branch 73 not taken.
✓ Branch 76 taken 1002 times.
✗ Branch 77 not taken.
✓ Branch 79 taken 1002 times.
✗ Branch 80 not taken.
✓ Branch 82 taken 1002 times.
✗ Branch 83 not taken.
✓ Branch 85 taken 1002 times.
✗ Branch 86 not taken.
|
1002 | BOOST_TEST_MESSAGE(tf1 << '\n' |
129 | << resA.normal.format(pyfmt) << '\n' | ||
130 | << resA.nearest_points[0].format(pyfmt) << '\n' | ||
131 | << resA.nearest_points[1].format(pyfmt) << '\n' | ||
132 | << '\n' | ||
133 | << tf2 << '\n' | ||
134 | << resB.normal.format(pyfmt) << '\n' | ||
135 | << resB.nearest_points[0].format(pyfmt) << '\n' | ||
136 | << resB.nearest_points[1].format(pyfmt) << '\n'); | ||
137 | // TODO in one case, there is a mismatch between the distances and I cannot | ||
138 | // say which one is correct. To visualize the case, use script | ||
139 | // test/geometric_shapes.py | ||
140 |
6/12✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1002 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1002 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 1002 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1002 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1002 times.
|
1002 | BOOST_WARN_CLOSE(resA.min_distance, resB.min_distance, tol); |
141 | // BOOST_CHECK_CLOSE(resA.min_distance, resB.min_distance, tol); | ||
142 | |||
143 | // Only warnings because there are still some bugs. | ||
144 |
7/14✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1002 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1002 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1002 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1002 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1002 times.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1002 times.
|
1002 | BOOST_WARN_SMALL((resA.normal - resA.normal).squaredNorm(), tol); |
145 |
7/14✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1002 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 1002 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1002 times.
✗ Branch 14 not taken.
✓ Branch 18 taken 1002 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1002 times.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 1002 times.
|
1002 | BOOST_WARN_SMALL( |
146 | (resA.nearest_points[0] - resB.nearest_points[0]).squaredNorm(), tol); | ||
147 |
7/14✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1002 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 1002 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1002 times.
✗ Branch 14 not taken.
✓ Branch 18 taken 1002 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1002 times.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 1002 times.
|
1002 | BOOST_WARN_SMALL( |
148 | (resA.nearest_points[1] - resB.nearest_points[1]).squaredNorm(), tol); | ||
149 | 1002 | } | |
150 | |||
151 |
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(compare_convex_box) { |
152 | 2 | Scalar extents[6] = {0, 0, 0, 10, 10, 10}; | |
153 | 2 | Scalar l = 1, w = 1, d = 1, eps = Scalar(1e-4); | |
154 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | Box box(l * 2, w * 2, d * 2); |
155 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | Convex<Quadrilateral> convex_box(buildBox(l, w, d)); |
156 | |||
157 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | Transform3s tf1; |
158 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | Transform3s tf2; |
159 | |||
160 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | tf2.setTranslation(Vec3s(3, 0, 0)); |
161 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | compareShapeIntersection(box, convex_box, tf1, tf2, eps); |
162 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | compareShapeDistance(box, convex_box, tf1, tf2, eps); |
163 | |||
164 |
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, 0)); |
165 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | compareShapeIntersection(box, convex_box, tf1, tf2, eps); |
166 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | compareShapeDistance(box, convex_box, tf1, tf2, eps); |
167 | |||
168 |
2/2✓ Branch 0 taken 1000 times.
✓ Branch 1 taken 1 times.
|
2002 | for (int i = 0; i < 1000; ++i) { |
169 |
1/2✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
|
2000 | generateRandomTransform(extents, tf2); |
170 |
1/2✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
|
2000 | compareShapeIntersection(box, convex_box, tf1, tf2, eps); |
171 |
1/2✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
|
2000 | compareShapeDistance(box, convex_box, tf1, tf2, eps); |
172 | } | ||
173 | 2 | } | |
174 | |||
175 | #ifdef COAL_HAS_QHULL | ||
176 | BOOST_AUTO_TEST_CASE(convex_hull_throw) { | ||
177 | std::shared_ptr<std::vector<Vec3s>> points( | ||
178 | new std::vector<Vec3s>({Vec3s(1, 1, 1), Vec3s(0, 0, 0), Vec3s(1, 0, 0)})); | ||
179 | |||
180 | BOOST_CHECK_THROW(ConvexBase::convexHull(points, 0, false, NULL), | ||
181 | std::invalid_argument); | ||
182 | BOOST_CHECK_THROW(ConvexBase::convexHull(points, 1, false, NULL), | ||
183 | std::invalid_argument); | ||
184 | BOOST_CHECK_THROW(ConvexBase::convexHull(points, 2, false, NULL), | ||
185 | std::invalid_argument); | ||
186 | BOOST_CHECK_THROW(ConvexBase::convexHull(points, 3, false, NULL), | ||
187 | std::invalid_argument); | ||
188 | } | ||
189 | |||
190 | BOOST_AUTO_TEST_CASE(convex_hull_quad) { | ||
191 | std::shared_ptr<std::vector<Vec3s>> points(new std::vector<Vec3s>({ | ||
192 | Vec3s(1, 1, 1), | ||
193 | Vec3s(0, 0, 0), | ||
194 | Vec3s(1, 0, 0), | ||
195 | Vec3s(0, 0, 1), | ||
196 | })); | ||
197 | |||
198 | ConvexBase* convexHull = ConvexBase::convexHull(points, 4, false, NULL); | ||
199 | |||
200 | BOOST_REQUIRE_EQUAL(convexHull->num_points, 4); | ||
201 | BOOST_CHECK_EQUAL((*(convexHull->neighbors))[0].count(), 3); | ||
202 | BOOST_CHECK_EQUAL((*(convexHull->neighbors))[1].count(), 3); | ||
203 | BOOST_CHECK_EQUAL((*(convexHull->neighbors))[2].count(), 3); | ||
204 | delete convexHull; | ||
205 | } | ||
206 | |||
207 | BOOST_AUTO_TEST_CASE(convex_hull_box_like) { | ||
208 | std::shared_ptr<std::vector<Vec3s>> points(new std::vector<Vec3s>({ | ||
209 | Vec3s(1, 1, 1), | ||
210 | Vec3s(1, 1, -1), | ||
211 | Vec3s(1, -1, 1), | ||
212 | Vec3s(1, -1, -1), | ||
213 | Vec3s(-1, 1, 1), | ||
214 | Vec3s(-1, 1, -1), | ||
215 | Vec3s(-1, -1, 1), | ||
216 | Vec3s(-1, -1, -1), | ||
217 | Vec3s(0, 0, 0), | ||
218 | Vec3s(0, 0, Scalar(0.99)), | ||
219 | })); | ||
220 | |||
221 | ConvexBase* convexHull = ConvexBase::convexHull(points, 9, false, NULL); | ||
222 | |||
223 | BOOST_REQUIRE_EQUAL(8, convexHull->num_points); | ||
224 | { | ||
225 | const std::vector<Vec3s>& cvxhull_points = *(convexHull->points); | ||
226 | for (size_t i = 0; i < 8; ++i) { | ||
227 | BOOST_CHECK(cvxhull_points[i].cwiseAbs() == Vec3s(1, 1, 1)); | ||
228 | BOOST_CHECK_EQUAL((*(convexHull->neighbors))[i].count(), 3); | ||
229 | } | ||
230 | } | ||
231 | delete convexHull; | ||
232 | |||
233 | convexHull = ConvexBase::convexHull(points, 9, true, NULL); | ||
234 | Convex<Triangle>* convex_tri = dynamic_cast<Convex<Triangle>*>(convexHull); | ||
235 | BOOST_CHECK(convex_tri != NULL); | ||
236 | |||
237 | BOOST_REQUIRE_EQUAL(8, convexHull->num_points); | ||
238 | { | ||
239 | const std::vector<Vec3s>& cvxhull_points = *(convexHull->points); | ||
240 | for (size_t i = 0; i < 8; ++i) { | ||
241 | BOOST_CHECK(cvxhull_points[i].cwiseAbs() == Vec3s(1, 1, 1)); | ||
242 | BOOST_CHECK((*(convexHull->neighbors))[i].count() >= 3); | ||
243 | BOOST_CHECK((*(convexHull->neighbors))[i].count() <= 6); | ||
244 | } | ||
245 | } | ||
246 | delete convexHull; | ||
247 | } | ||
248 | |||
249 | BOOST_AUTO_TEST_CASE(convex_copy_constructor) { | ||
250 | Convex<Triangle>* convexHullTriCopy; | ||
251 | { | ||
252 | std::shared_ptr<std::vector<Vec3s>> points(new std::vector<Vec3s>({ | ||
253 | Vec3s(1, 1, 1), | ||
254 | Vec3s(1, 1, -1), | ||
255 | Vec3s(1, -1, 1), | ||
256 | Vec3s(1, -1, -1), | ||
257 | Vec3s(-1, 1, 1), | ||
258 | Vec3s(-1, 1, -1), | ||
259 | Vec3s(-1, -1, 1), | ||
260 | Vec3s(-1, -1, -1), | ||
261 | Vec3s(0, 0, 0), | ||
262 | })); | ||
263 | |||
264 | Convex<Triangle>* convexHullTri = dynamic_cast<Convex<Triangle>*>( | ||
265 | ConvexBase::convexHull(points, 9, true, NULL)); | ||
266 | convexHullTriCopy = new Convex<Triangle>(*convexHullTri); | ||
267 | BOOST_CHECK(*convexHullTri == *convexHullTriCopy); | ||
268 | } | ||
269 | Convex<Triangle>* convexHullTriCopyOfCopy = | ||
270 | new Convex<Triangle>(*convexHullTriCopy); | ||
271 | BOOST_CHECK(*convexHullTriCopyOfCopy == *convexHullTriCopy); | ||
272 | } | ||
273 | |||
274 | BOOST_AUTO_TEST_CASE(convex_clone) { | ||
275 | std::shared_ptr<std::vector<Vec3s>> points(new std::vector<Vec3s>({ | ||
276 | Vec3s(1, 1, 1), | ||
277 | Vec3s(1, 1, -1), | ||
278 | Vec3s(1, -1, 1), | ||
279 | Vec3s(1, -1, -1), | ||
280 | Vec3s(-1, 1, 1), | ||
281 | Vec3s(-1, 1, -1), | ||
282 | Vec3s(-1, -1, 1), | ||
283 | Vec3s(-1, -1, -1), | ||
284 | Vec3s(0, 0, 0), | ||
285 | })); | ||
286 | |||
287 | Convex<Triangle>* convexHullTri = dynamic_cast<Convex<Triangle>*>( | ||
288 | ConvexBase::convexHull(points, 9, true, NULL)); | ||
289 | Convex<Triangle>* convexHullTriCopy; | ||
290 | convexHullTriCopy = convexHullTri->clone(); | ||
291 | BOOST_CHECK(*convexHullTri == *convexHullTriCopy); | ||
292 | } | ||
293 | |||
294 | #endif | ||
295 |