38 #ifndef HPP_FCL_BV_SPLITTER_H 39 #define HPP_FCL_BV_SPLITTER_H 58 template <
typename BV>
76 void computeRule(
const BV& bv,
unsigned int* primitive_indices,
77 unsigned int num_primitives) {
89 std::cerr <<
"Split method not supported" << std::endl;
130 Vec3f center = bv.center();
133 if (bv.width() >= bv.height() && bv.width() >= bv.depth())
135 else if (bv.height() >= bv.width() && bv.height() >= bv.depth())
139 split_value = center[axis];
145 unsigned int num_primitives) {
148 if (bv.width() >= bv.height() && bv.width() >= bv.depth())
150 else if (bv.height() >= bv.width() && bv.height() >= bv.depth())
157 for (
unsigned int i = 0; i < num_primitives; ++i) {
158 const Triangle&
t = tri_indices[primitive_indices[i]];
165 for (
unsigned int i = 0; i < num_primitives; ++i) {
166 sum += vertices[primitive_indices[i]][
split_axis];
170 split_value = sum / num_primitives;
176 unsigned int num_primitives) {
179 if (bv.width() >= bv.height() && bv.width() >= bv.depth())
181 else if (bv.height() >= bv.width() && bv.height() >= bv.depth())
185 std::vector<FCL_REAL> proj((
size_t)num_primitives);
188 for (
unsigned int i = 0; i < num_primitives; ++i) {
189 const Triangle&
t = tri_indices[primitive_indices[i]];
195 for (
unsigned int i = 0; i < num_primitives; ++i)
196 proj[i] = vertices[primitive_indices[i]][split_axis];
199 std::sort(proj.begin(), proj.end());
201 if (num_primitives % 2 == 1) {
202 split_value = proj[(num_primitives - 1) / 2];
205 (proj[num_primitives / 2] + proj[num_primitives / 2 - 1]) / 2;
224 const OBB& bv,
unsigned int* primitive_indices,
225 unsigned int num_primitives);
229 const OBB& bv,
unsigned int* primitive_indices,
230 unsigned int num_primitives);
234 const OBB& bv,
unsigned int* primitive_indices,
235 unsigned int num_primitives);
239 const RSS& bv,
unsigned int* primitive_indices,
240 unsigned int num_primitives);
244 const RSS& bv,
unsigned int* primitive_indices,
245 unsigned int num_primitives);
249 const RSS& bv,
unsigned int* primitive_indices,
250 unsigned int num_primitives);
254 const kIOS& bv,
unsigned int* primitive_indices,
255 unsigned int num_primitives);
259 const kIOS& bv,
unsigned int* primitive_indices,
260 unsigned int num_primitives);
264 const kIOS& bv,
unsigned int* primitive_indices,
265 unsigned int num_primitives);
269 const OBBRSS& bv,
unsigned int* primitive_indices,
270 unsigned int num_primitives);
274 const OBBRSS& bv,
unsigned int* primitive_indices,
275 unsigned int num_primitives);
279 const OBBRSS& bv,
unsigned int* primitive_indices,
280 unsigned int num_primitives);
virtual ~BVSplitter()
Default deconstructor.
SplitMethodType split_method
The split algorithm used.
void computeRule_bvcenter(const BV &bv, unsigned int *, unsigned int)
Split algorithm 1: Split the node from center.
Triangle * tri_indices
The triangles handled by the splitter.
A class describing the kIOS collision structure, which is a set of spheres.
Vec3f * vertices
The mesh vertices or points handled by the splitter.
BVHModelType
BVH model type.
BVSplitter(SplitMethodType method)
FCL_REAL split_value
The split threshold, different primitives are splitted according whether their projection on the spli...
Triangle with 3 indices for points.
SplitMethodType
Three types of split algorithms are provided in FCL as default.
void computeRule(const BV &bv, unsigned int *primitive_indices, unsigned int num_primitives)
Compute the split rule according to a subset of geometry and the corresponding BV node...
int split_axis
The axis based on which the split decision is made. For most BV, the axis is aligned with one of the ...
bool apply(const Vec3f &q) const
Apply the split rule on a given point.
A class describing the split rule that splits each BV node.
Eigen::Matrix< FCL_REAL, 3, 1 > Vec3f
BVHModelType type
Whether the geometry is mesh or point cloud.
void clear()
Clear the geometry data set before.
void computeRule_mean(const BV &bv, unsigned int *primitive_indices, unsigned int num_primitives)
Split algorithm 2: Split the node according to the mean of the data contained.
void computeRule_median(const BV &bv, unsigned int *primitive_indices, unsigned int num_primitives)
Split algorithm 3: Split the node according to the median of the data contained.
Oriented bounding box class.