GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: include/hpp/fcl/BV/kDOP.h Lines: 7 15 46.7 %
Date: 2024-02-09 12:57:42 Branches: 5 16 31.2 %

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 HPP_FCL_KDOP_H
39
#define HPP_FCL_KDOP_H
40
41
#include <hpp/fcl/fwd.hh>
42
#include <hpp/fcl/data_types.h>
43
44
namespace hpp {
45
namespace fcl {
46
47
struct CollisionRequest;
48
49
/// @addtogroup Bounding_Volume
50
/// @{
51
52
/// @brief KDOP class describes the KDOP collision structures. K is set as the
53
/// template parameter, which should be 16, 18, or 24
54
///  The KDOP structure is defined by some pairs of parallel planes defined by
55
///  some axes.
56
/// For K = 16, the planes are 6 AABB planes and 10 diagonal planes that cut off
57
/// some space of the edges:
58
/// (-1,0,0) and (1,0,0)  -> indices 0 and 8
59
/// (0,-1,0) and (0,1,0)  -> indices 1 and 9
60
/// (0,0,-1) and (0,0,1)  -> indices 2 and 10
61
/// (-1,-1,0) and (1,1,0) -> indices 3 and 11
62
/// (-1,0,-1) and (1,0,1) -> indices 4 and 12
63
/// (0,-1,-1) and (0,1,1) -> indices 5 and 13
64
/// (-1,1,0) and (1,-1,0) -> indices 6 and 14
65
/// (-1,0,1) and (1,0,-1) -> indices 7 and 15
66
/// For K = 18, the planes are 6 AABB planes and 12 diagonal planes that cut off
67
/// some space of the edges:
68
/// (-1,0,0) and (1,0,0)  -> indices 0 and 9
69
/// (0,-1,0) and (0,1,0)  -> indices 1 and 10
70
/// (0,0,-1) and (0,0,1)  -> indices 2 and 11
71
/// (-1,-1,0) and (1,1,0) -> indices 3 and 12
72
/// (-1,0,-1) and (1,0,1) -> indices 4 and 13
73
/// (0,-1,-1) and (0,1,1) -> indices 5 and 14
74
/// (-1,1,0) and (1,-1,0) -> indices 6 and 15
75
/// (-1,0,1) and (1,0,-1) -> indices 7 and 16
76
/// (0,-1,1) and (0,1,-1) -> indices 8 and 17
77
/// For K = 18, the planes are 6 AABB planes and 18 diagonal planes that cut off
78
/// some space of the edges:
79
/// (-1,0,0) and (1,0,0)  -> indices 0 and 12
80
/// (0,-1,0) and (0,1,0)  -> indices 1 and 13
81
/// (0,0,-1) and (0,0,1)  -> indices 2 and 14
82
/// (-1,-1,0) and (1,1,0) -> indices 3 and 15
83
/// (-1,0,-1) and (1,0,1) -> indices 4 and 16
84
/// (0,-1,-1) and (0,1,1) -> indices 5 and 17
85
/// (-1,1,0) and (1,-1,0) -> indices 6 and 18
86
/// (-1,0,1) and (1,0,-1) -> indices 7 and 19
87
/// (0,-1,1) and (0,1,-1) -> indices 8 and 20
88
/// (-1, -1, 1) and (1, 1, -1) --> indices 9 and 21
89
/// (-1, 1, -1) and (1, -1, 1) --> indices 10 and 22
90
/// (1, -1, -1) and (-1, 1, 1) --> indices 11 and 23
91
template <short N>
92
class HPP_FCL_DLLAPI KDOP {
93
 protected:
94
  /// @brief Origin's distances to N KDOP planes
95
  Eigen::Array<FCL_REAL, N, 1> dist_;
96
97
 public:
98
  /// @brief Creating kDOP containing nothing
99
  KDOP();
100
101
  /// @brief Creating kDOP containing only one point
102
  KDOP(const Vec3f& v);
103
104
  /// @brief Creating kDOP containing two points
105
  KDOP(const Vec3f& a, const Vec3f& b);
106
107
  /// @brief Equality operator
108
  bool operator==(const KDOP& other) const {
109
    return (dist_ == other.dist_).all();
110
  }
111
112
  /// @brief Difference operator
113
  bool operator!=(const KDOP& other) const {
114
    return (dist_ != other.dist_).any();
115
  }
116
117
  /// @brief Check whether two KDOPs overlap.
118
  bool overlap(const KDOP<N>& other) const;
119
120
  /// @brief Check whether two KDOPs overlap.
121
  /// @return true if collision happens.
122
  /// @retval sqrDistLowerBound squared lower bound on distance between boxes if
123
  ///         they do not overlap.
124
  bool overlap(const KDOP<N>& other, const CollisionRequest& request,
125
               FCL_REAL& sqrDistLowerBound) const;
126
127
  /// @brief The distance between two KDOP<N>. Not implemented.
128
  FCL_REAL distance(const KDOP<N>& other, Vec3f* P = NULL,
129
                    Vec3f* Q = NULL) const;
130
131
  /// @brief Merge the point and the KDOP
132
  KDOP<N>& operator+=(const Vec3f& p);
133
134
  /// @brief Merge two KDOPs
135
  KDOP<N>& operator+=(const KDOP<N>& other);
136
137
  /// @brief Create a KDOP by mergin two KDOPs
138
  KDOP<N> operator+(const KDOP<N>& other) const;
139
140
  /// @brief Size of the kDOP (used in BV_Splitter to order two kDOPs)
141
82809620
  inline FCL_REAL size() const {
142
82809620
    return width() * width() + height() * height() + depth() * depth();
143
  }
144
145
  /// @brief The (AABB) center
146
253488
  inline Vec3f center() const {
147


253488
    return (dist_.template head<3>() + dist_.template segment<3>(N / 2)) / 2;
148
  }
149
150
  /// @brief The (AABB) width
151
167461054
  inline FCL_REAL width() const { return dist_[N / 2] - dist_[0]; }
152
153
  /// @brief The (AABB) height
154
167437564
  inline FCL_REAL height() const { return dist_[N / 2 + 1] - dist_[1]; }
155
156
  /// @brief The (AABB) depth
157
166441546
  inline FCL_REAL depth() const { return dist_[N / 2 + 2] - dist_[2]; }
158
159
  /// @brief The (AABB) volume
160
  inline FCL_REAL volume() const { return width() * height() * depth(); }
161
162
  inline FCL_REAL dist(short i) const { return dist_[i]; }
163
164
  inline FCL_REAL& dist(short i) { return dist_[i]; }
165
166
  //// @brief Check whether one point is inside the KDOP
167
  bool inside(const Vec3f& p) const;
168
169
 public:
170
  /// \cond
171
  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
172
  /// \endcond
173
};
174
175
template <short N>
176
bool overlap(const Matrix3f& /*R0*/, const Vec3f& /*T0*/, const KDOP<N>& /*b1*/,
177
             const KDOP<N>& /*b2*/) {
178
  HPP_FCL_THROW_PRETTY("not implemented", std::logic_error);
179
}
180
181
template <short N>
182
bool overlap(const Matrix3f& /*R0*/, const Vec3f& /*T0*/, const KDOP<N>& /*b1*/,
183
             const KDOP<N>& /*b2*/, const CollisionRequest& /*request*/,
184
             FCL_REAL& /*sqrDistLowerBound*/) {
185
  HPP_FCL_THROW_PRETTY("not implemented", std::logic_error);
186
}
187
188
/// @brief translate the KDOP BV
189
template <short N>
190
HPP_FCL_DLLAPI KDOP<N> translate(const KDOP<N>& bv, const Vec3f& t);
191
192
}  // namespace fcl
193
194
}  // namespace hpp
195
196
#endif