GCC Code Coverage Report


Directory: ./
File: include/coal/BV/kDOP.h
Date: 2025-05-02 10:16:21
Exec Total Coverage
Lines: 7 14 50.0%
Branches: 5 14 35.7%

Line Branch Exec Source
1 /*
2 * Software License Agreement (BSD License)
3 *
4 * Copyright (c) 2011-2014, Willow Garage, Inc.
5 * Copyright (c) 2014-2015, Open Source Robotics Foundation
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * * Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * * Redistributions in binary form must reproduce the above
15 * copyright notice, this list of conditions and the following
16 * disclaimer in the documentation and/or other materials provided
17 * with the distribution.
18 * * Neither the name of Open Source Robotics Foundation nor the names of its
19 * contributors may be used to endorse or promote products derived
20 * from this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 * POSSIBILITY OF SUCH DAMAGE.
34 */
35
36 /** \author Jia Pan */
37
38 #ifndef COAL_KDOP_H
39 #define COAL_KDOP_H
40
41 #include "coal/fwd.hh"
42 #include "coal/data_types.h"
43
44 namespace coal {
45
46 struct CollisionRequest;
47
48 /// @addtogroup Bounding_Volume
49 /// @{
50
51 /// @brief KDOP class describes the KDOP collision structures. K is set as the
52 /// template parameter, which should be 16, 18, or 24
53 /// The KDOP structure is defined by some pairs of parallel planes defined by
54 /// some axes.
55 /// For K = 16, the planes are 6 AABB planes and 10 diagonal planes that cut off
56 /// some space of the edges:
57 /// (-1,0,0) and (1,0,0) -> indices 0 and 8
58 /// (0,-1,0) and (0,1,0) -> indices 1 and 9
59 /// (0,0,-1) and (0,0,1) -> indices 2 and 10
60 /// (-1,-1,0) and (1,1,0) -> indices 3 and 11
61 /// (-1,0,-1) and (1,0,1) -> indices 4 and 12
62 /// (0,-1,-1) and (0,1,1) -> indices 5 and 13
63 /// (-1,1,0) and (1,-1,0) -> indices 6 and 14
64 /// (-1,0,1) and (1,0,-1) -> indices 7 and 15
65 /// For K = 18, the planes are 6 AABB planes and 12 diagonal planes that cut off
66 /// some space of the edges:
67 /// (-1,0,0) and (1,0,0) -> indices 0 and 9
68 /// (0,-1,0) and (0,1,0) -> indices 1 and 10
69 /// (0,0,-1) and (0,0,1) -> indices 2 and 11
70 /// (-1,-1,0) and (1,1,0) -> indices 3 and 12
71 /// (-1,0,-1) and (1,0,1) -> indices 4 and 13
72 /// (0,-1,-1) and (0,1,1) -> indices 5 and 14
73 /// (-1,1,0) and (1,-1,0) -> indices 6 and 15
74 /// (-1,0,1) and (1,0,-1) -> indices 7 and 16
75 /// (0,-1,1) and (0,1,-1) -> indices 8 and 17
76 /// For K = 18, the planes are 6 AABB planes and 18 diagonal planes that cut off
77 /// some space of the edges:
78 /// (-1,0,0) and (1,0,0) -> indices 0 and 12
79 /// (0,-1,0) and (0,1,0) -> indices 1 and 13
80 /// (0,0,-1) and (0,0,1) -> indices 2 and 14
81 /// (-1,-1,0) and (1,1,0) -> indices 3 and 15
82 /// (-1,0,-1) and (1,0,1) -> indices 4 and 16
83 /// (0,-1,-1) and (0,1,1) -> indices 5 and 17
84 /// (-1,1,0) and (1,-1,0) -> indices 6 and 18
85 /// (-1,0,1) and (1,0,-1) -> indices 7 and 19
86 /// (0,-1,1) and (0,1,-1) -> indices 8 and 20
87 /// (-1, -1, 1) and (1, 1, -1) --> indices 9 and 21
88 /// (-1, 1, -1) and (1, -1, 1) --> indices 10 and 22
89 /// (1, -1, -1) and (-1, 1, 1) --> indices 11 and 23
90 template <short N>
91 class COAL_DLLAPI KDOP {
92 protected:
93 /// @brief Origin's distances to N KDOP planes
94 Eigen::Array<Scalar, N, 1> dist_;
95
96 public:
97 /// @brief Creating kDOP containing nothing
98 KDOP();
99
100 /// @brief Creating kDOP containing only one point
101 KDOP(const Vec3s& v);
102
103 /// @brief Creating kDOP containing two points
104 KDOP(const Vec3s& a, const Vec3s& b);
105
106 /// @brief Equality operator
107 bool operator==(const KDOP& other) const {
108 return (dist_ == other.dist_).all();
109 }
110
111 /// @brief Difference operator
112 bool operator!=(const KDOP& other) const {
113 return (dist_ != other.dist_).any();
114 }
115
116 /// @brief Check whether two KDOPs overlap.
117 bool overlap(const KDOP& other) const;
118
119 /// @brief Check whether two KDOPs overlap.
120 /// @return true if collision happens.
121 /// @retval sqrDistLowerBound squared lower bound on distance between boxes if
122 /// they do not overlap.
123 bool overlap(const KDOP& other, const CollisionRequest& request,
124 Scalar& sqrDistLowerBound) const;
125
126 /// @brief The distance between two KDOP, Not implemented.
127 Scalar distance(const KDOP& other, Vec3s* P = NULL, Vec3s* Q = NULL) const;
128
129 /// @brief Merge the point and the KDOP
130 KDOP& operator+=(const Vec3s& p);
131
132 /// @brief Merge two KDOPs
133 KDOP& operator+=(const KDOP& other);
134
135 /// @brief Create a KDOP by mergin two KDOPs
136 KDOP<N> operator+(const KDOP& other) const;
137
138 /// @brief Size of the kDOP (used in BV_Splitter to order two kDOPs)
139 82809620 inline Scalar size() const {
140 82809620 return width() * width() + height() * height() + depth() * depth();
141 }
142
143 /// @brief The (AABB) center
144 253488 inline Vec3s center() const {
145
5/10
✓ Branch 1 taken 126744 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 126744 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 126744 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 126744 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 126744 times.
✗ Branch 14 not taken.
253488 return (dist_.template head<3>() + dist_.template segment<3>(N / 2)) / 2;
146 }
147
148 /// @brief The (AABB) width
149 167461054 inline Scalar width() const { return dist_[N / 2] - dist_[0]; }
150
151 /// @brief The (AABB) height
152 167437564 inline Scalar height() const { return dist_[N / 2 + 1] - dist_[1]; }
153
154 /// @brief The (AABB) depth
155 166441546 inline Scalar depth() const { return dist_[N / 2 + 2] - dist_[2]; }
156
157 /// @brief The (AABB) volume
158 inline Scalar volume() const { return width() * height() * depth(); }
159
160 inline Scalar dist(short i) const { return dist_[i]; }
161
162 inline Scalar& dist(short i) { return dist_[i]; }
163
164 //// @brief Check whether one point is inside the KDOP
165 bool inside(const Vec3s& p) const;
166
167 public:
168 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
169 };
170
171 /** @} */ // end of Bounding_Volume
172
173 template <short N>
174 bool overlap(const Matrix3s& /*R0*/, const Vec3s& /*T0*/, const KDOP<N>& /*b1*/,
175 const KDOP<N>& /*b2*/) {
176 COAL_THROW_PRETTY("not implemented", std::logic_error);
177 }
178
179 template <short N>
180 bool overlap(const Matrix3s& /*R0*/, const Vec3s& /*T0*/, const KDOP<N>& /*b1*/,
181 const KDOP<N>& /*b2*/, const CollisionRequest& /*request*/,
182 Scalar& /*sqrDistLowerBound*/) {
183 COAL_THROW_PRETTY("not implemented", std::logic_error);
184 }
185
186 /// @brief translate the KDOP BV
187 template <short N>
188 COAL_DLLAPI KDOP<N> translate(const KDOP<N>& bv, const Vec3s& t);
189
190 } // namespace coal
191
192 #endif
193