GCC Code Coverage Report


Directory: ./
File: test/convex.cpp
Date: 2025-05-02 10:16:21
Exec Total Coverage
Lines: 102 102 100.0%
Branches: 468 926 50.5%

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 ConvexTpl<Quadrilateral32> 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 12 taken 8 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 8 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✓ Branch 20 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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(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 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box.neighbor(7, 2), 6);
87
88 // Cast to int16 and check that the box is the same
89
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ConvexTpl<Quadrilateral16> box16 = box.cast<Quadrilateral16>();
90
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(0, 0), 1);
91
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(0, 1), 2);
92
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(0, 2), 4);
93
94
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(1, 0), 0);
95
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(1, 1), 3);
96
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(1, 2), 5);
97
98
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(2, 0), 0);
99
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(2, 1), 3);
100
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(2, 2), 6);
101
102
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(3, 0), 1);
103
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(3, 1), 2);
104
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(3, 2), 7);
105
106
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(4, 0), 0);
107
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(4, 1), 5);
108
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(4, 2), 6);
109
110
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(5, 0), 1);
111
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(5, 1), 4);
112
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(5, 2), 7);
113
114
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(6, 0), 2);
115
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(6, 1), 4);
116
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(6, 2), 7);
117
118
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(7, 0), 3);
119
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(7, 1), 5);
120
5/10
✓ 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 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(box16.neighbor(7, 2), 6);
121
122 2 const std::vector<Vec3s>& box_points = *(box.points);
123 2 const std::vector<Vec3s>& box16_points = *(box16.points);
124
2/2
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 1 times.
18 for (size_t i = 0; i < box.points->size(); ++i) {
125
16/32
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 8 times.
✗ Branch 17 not taken.
✓ Branch 20 taken 8 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 8 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 8 times.
✗ Branch 27 not taken.
✓ Branch 30 taken 8 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 8 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 8 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 8 times.
✗ Branch 42 not taken.
✓ Branch 44 taken 8 times.
✗ Branch 45 not taken.
✓ Branch 47 taken 8 times.
✗ Branch 48 not taken.
✓ Branch 50 taken 8 times.
✗ Branch 51 not taken.
✗ Branch 61 not taken.
✓ Branch 62 taken 8 times.
16 EIGEN_VECTOR_IS_APPROX(box_points[i], box16_points[i], 1e-12);
126 }
127 2 }
128
129 template <typename Sa, typename Sb>
130 1002 void compareShapeIntersection(const Sa& sa, const Sb& sb,
131 const Transform3s& tf1, const Transform3s& tf2,
132 Scalar tol = Scalar(1e-9)) {
133
1/2
✓ Branch 2 taken 1002 times.
✗ Branch 3 not taken.
1002 CollisionRequest request(CONTACT | DISTANCE_LOWER_BOUND, 1);
134
2/4
✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1002 times.
✗ Branch 5 not taken.
1002 CollisionResult resA, resB;
135
136
1/2
✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
1002 collide(&sa, tf1, &sa, tf2, request, resA);
137
1/2
✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
1002 collide(&sb, tf1, &sb, tf2, request, resB);
138
139
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());
140
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());
141
142
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()) {
143
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);
144
145
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'
146 << cA.pos.format(pyfmt) << '\n'
147 << '\n'
148 << tf2 << '\n'
149 << cB.pos.format(pyfmt) << '\n');
150 // Only warnings because there are still some bugs.
151
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);
152
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);
153 } else {
154
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,
155 tol); // distances should be same
156 }
157 1002 }
158
159 template <typename Sa, typename Sb>
160 1002 void compareShapeDistance(const Sa& sa, const Sb& sb, const Transform3s& tf1,
161 const Transform3s& tf2, Scalar tol = Scalar(1e-9)) {
162
1/2
✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
1002 DistanceRequest request(true);
163
2/4
✓ Branch 2 taken 1002 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1002 times.
✗ Branch 7 not taken.
1002 DistanceResult resA, resB;
164
165
1/2
✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
1002 distance(&sa, tf1, &sa, tf2, request, resA);
166
1/2
✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
1002 distance(&sb, tf1, &sb, tf2, request, resB);
167
168
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'
169 << resA.normal.format(pyfmt) << '\n'
170 << resA.nearest_points[0].format(pyfmt) << '\n'
171 << resA.nearest_points[1].format(pyfmt) << '\n'
172 << '\n'
173 << tf2 << '\n'
174 << resB.normal.format(pyfmt) << '\n'
175 << resB.nearest_points[0].format(pyfmt) << '\n'
176 << resB.nearest_points[1].format(pyfmt) << '\n');
177 // TODO in one case, there is a mismatch between the distances and I cannot
178 // say which one is correct. To visualize the case, use script
179 // test/geometric_shapes.py
180
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);
181 // BOOST_CHECK_CLOSE(resA.min_distance, resB.min_distance, tol);
182
183 // Only warnings because there are still some bugs.
184
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);
185
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(
186 (resA.nearest_points[0] - resB.nearest_points[0]).squaredNorm(), tol);
187
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(
188 (resA.nearest_points[1] - resB.nearest_points[1]).squaredNorm(), tol);
189 1002 }
190
191
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) {
192 2 Scalar extents[6] = {0, 0, 0, 10, 10, 10};
193 2 Scalar l = 1, w = 1, d = 1, eps = Scalar(1e-4);
194
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Box box(l * 2, w * 2, d * 2);
195
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ConvexTpl<Quadrilateral32> convex_box(buildBox(l, w, d));
196
197
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Transform3s tf1;
198
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Transform3s tf2;
199
200
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));
201
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 compareShapeIntersection(box, convex_box, tf1, tf2, eps);
202
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 compareShapeDistance(box, convex_box, tf1, tf2, eps);
203
204
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));
205
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 compareShapeIntersection(box, convex_box, tf1, tf2, eps);
206
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 compareShapeDistance(box, convex_box, tf1, tf2, eps);
207
208
2/2
✓ Branch 0 taken 1000 times.
✓ Branch 1 taken 1 times.
2002 for (int i = 0; i < 1000; ++i) {
209
1/2
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
2000 generateRandomTransform(extents, tf2);
210
1/2
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
2000 compareShapeIntersection(box, convex_box, tf1, tf2, eps);
211
1/2
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
2000 compareShapeDistance(box, convex_box, tf1, tf2, eps);
212 }
213 2 }
214
215 #ifdef COAL_HAS_QHULL
216 BOOST_AUTO_TEST_CASE(convex_hull_throw) {
217 std::shared_ptr<std::vector<Vec3s>> points(
218 new std::vector<Vec3s>({Vec3s(1, 1, 1), Vec3s(0, 0, 0), Vec3s(1, 0, 0)}));
219
220 BOOST_CHECK_THROW(ConvexBase32::convexHull(points, 0, false, NULL),
221 std::invalid_argument);
222 BOOST_CHECK_THROW(ConvexBase32::convexHull(points, 1, false, NULL),
223 std::invalid_argument);
224 BOOST_CHECK_THROW(ConvexBase32::convexHull(points, 2, false, NULL),
225 std::invalid_argument);
226 BOOST_CHECK_THROW(ConvexBase32::convexHull(points, 3, false, NULL),
227 std::invalid_argument);
228 }
229
230 BOOST_AUTO_TEST_CASE(convex_hull_quad) {
231 std::shared_ptr<std::vector<Vec3s>> points(new std::vector<Vec3s>({
232 Vec3s(1, 1, 1),
233 Vec3s(0, 0, 0),
234 Vec3s(1, 0, 0),
235 Vec3s(0, 0, 1),
236 }));
237
238 ConvexBase32* convexHull = ConvexBase32::convexHull(points, 4, false, NULL);
239
240 BOOST_REQUIRE_EQUAL(convexHull->num_points, 4);
241 BOOST_CHECK_EQUAL((*(convexHull->neighbors))[0].count, 3);
242 BOOST_CHECK_EQUAL((*(convexHull->neighbors))[1].count, 3);
243 BOOST_CHECK_EQUAL((*(convexHull->neighbors))[2].count, 3);
244 delete convexHull;
245 }
246
247 BOOST_AUTO_TEST_CASE(convex_hull_box_like) {
248 std::shared_ptr<std::vector<Vec3s>> points(new std::vector<Vec3s>({
249 Vec3s(1, 1, 1),
250 Vec3s(1, 1, -1),
251 Vec3s(1, -1, 1),
252 Vec3s(1, -1, -1),
253 Vec3s(-1, 1, 1),
254 Vec3s(-1, 1, -1),
255 Vec3s(-1, -1, 1),
256 Vec3s(-1, -1, -1),
257 Vec3s(0, 0, 0),
258 Vec3s(0, 0, Scalar(0.99)),
259 }));
260
261 ConvexBase32* convexHull = ConvexBase32::convexHull(points, 9, false, NULL);
262
263 BOOST_REQUIRE_EQUAL(8, convexHull->num_points);
264 {
265 const std::vector<Vec3s>& cvxhull_points = *(convexHull->points);
266 for (size_t i = 0; i < 8; ++i) {
267 BOOST_CHECK(cvxhull_points[i].cwiseAbs() == Vec3s(1, 1, 1));
268 BOOST_CHECK_EQUAL((*(convexHull->neighbors))[i].count, 3);
269 }
270 }
271 delete convexHull;
272
273 convexHull = ConvexBase32::convexHull(points, 9, true, NULL);
274 ConvexTpl<Triangle32>* convex_tri =
275 dynamic_cast<ConvexTpl<Triangle32>*>(convexHull);
276 BOOST_CHECK(convex_tri != NULL);
277
278 BOOST_REQUIRE_EQUAL(8, convexHull->num_points);
279 {
280 const std::vector<Vec3s>& cvxhull_points = *(convexHull->points);
281 for (size_t i = 0; i < 8; ++i) {
282 BOOST_CHECK(cvxhull_points[i].cwiseAbs() == Vec3s(1, 1, 1));
283 BOOST_CHECK((*(convexHull->neighbors))[i].count >= 3);
284 BOOST_CHECK((*(convexHull->neighbors))[i].count <= 6);
285 }
286 }
287 delete convexHull;
288 }
289
290 BOOST_AUTO_TEST_CASE(convex_copy_constructor) {
291 ConvexTpl<Triangle32>* convexHullTriCopy;
292 {
293 std::shared_ptr<std::vector<Vec3s>> points(new std::vector<Vec3s>({
294 Vec3s(1, 1, 1),
295 Vec3s(1, 1, -1),
296 Vec3s(1, -1, 1),
297 Vec3s(1, -1, -1),
298 Vec3s(-1, 1, 1),
299 Vec3s(-1, 1, -1),
300 Vec3s(-1, -1, 1),
301 Vec3s(-1, -1, -1),
302 Vec3s(0, 0, 0),
303 }));
304
305 ConvexTpl<Triangle32>* convexHullTri = dynamic_cast<ConvexTpl<Triangle32>*>(
306 ConvexBase32::convexHull(points, 9, true, NULL));
307 convexHullTriCopy = new ConvexTpl<Triangle32>(*convexHullTri);
308 BOOST_CHECK(*convexHullTri == *convexHullTriCopy);
309 }
310 ConvexTpl<Triangle32>* convexHullTriCopyOfCopy =
311 new ConvexTpl<Triangle32>(*convexHullTriCopy);
312 BOOST_CHECK(*convexHullTriCopyOfCopy == *convexHullTriCopy);
313 }
314
315 BOOST_AUTO_TEST_CASE(convex_clone) {
316 std::shared_ptr<std::vector<Vec3s>> points(new std::vector<Vec3s>({
317 Vec3s(1, 1, 1),
318 Vec3s(1, 1, -1),
319 Vec3s(1, -1, 1),
320 Vec3s(1, -1, -1),
321 Vec3s(-1, 1, 1),
322 Vec3s(-1, 1, -1),
323 Vec3s(-1, -1, 1),
324 Vec3s(-1, -1, -1),
325 Vec3s(0, 0, 0),
326 }));
327
328 ConvexTpl<Triangle32>* convexHullTri = dynamic_cast<ConvexTpl<Triangle32>*>(
329 ConvexBase32::convexHull(points, 9, true, NULL));
330 ConvexTpl<Triangle32>* convexHullTriCopy;
331 convexHullTriCopy = convexHullTri->clone();
332 BOOST_CHECK(*convexHullTri == *convexHullTriCopy);
333 }
334
335 #endif
336