10 #ifndef KDBVH_H_INCLUDED
11 #define KDBVH_H_INCLUDED
21 template <
typename Scalar,
int Dim>
34 template <
typename ObjectList,
typename VolumeList,
typename BoxIter>
36 void operator()(
const ObjectList &objects, BoxIter boxBegin, BoxIter boxEnd, VolumeList &outBoxes) {
37 outBoxes.insert(outBoxes.end(), boxBegin, boxEnd);
43 template <
typename ObjectList,
typename VolumeList>
45 void operator()(
const ObjectList &objects,
int,
int, VolumeList &outBoxes) {
46 outBoxes.reserve(objects.size());
67 template <
typename Scalar_,
int Dim_,
typename _Object>
72 typedef std::vector<Object, aligned_allocator<Object> >
ObjectList;
75 typedef std::vector<Volume, aligned_allocator<Volume> >
VolumeList;
84 template <
typename Iter>
91 template <
typename OIter,
typename BIter>
92 KdBVH(OIter begin, OIter
end, BIter boxBegin, BIter boxEnd) {
93 init(begin,
end, boxBegin, boxEnd);
98 template <
typename Iter>
105 template <
typename OIter,
typename BIter>
106 void init(OIter begin, OIter
end, BIter boxBegin, BIter boxEnd) {
112 int n =
static_cast<int>(
objects.size());
122 objCenters.reserve(
n);
126 for (
int i = 0;
i <
n; ++
i) objCenters.push_back(
VIPair(objBoxes[
i].center(),
i));
128 build(objCenters, 0,
n, objBoxes, 0);
146 outOEnd = outOBegin +
objects.size();
150 int numBoxes =
static_cast<int>(
boxes.size());
155 outVEnd = outVBegin + 2;
157 }
else if (
children[idx] >= numBoxes) {
160 outOEnd = outOBegin + 2;
163 outVEnd = outVBegin + 1;
165 outOEnd = outOBegin + 1;
174 typedef std::vector<VIPair, aligned_allocator<VIPair> >
VIPairList;
188 if (to - from == 2) {
189 boxes.push_back(objBoxes[objCenters[from].second].merged(objBoxes[objCenters[from + 1].second]));
192 }
else if (to - from == 3) {
194 std::nth_element(objCenters.begin() + from, objCenters.begin() + mid, objCenters.begin() + to,
196 build(objCenters, from, mid, objBoxes, (dim + 1) %
Dim);
198 boxes.push_back(
boxes[idx1].merged(objBoxes[objCenters[mid].second]));
202 int mid = from + (to - from) / 2;
203 nth_element(objCenters.begin() + from, objCenters.begin() + mid, objCenters.begin() + to,
205 build(objCenters, from, mid, objBoxes, (dim + 1) %
Dim);
207 build(objCenters, mid, to, objBoxes, (dim + 1) %
Dim);
Array< int, Dynamic, 1 > v
Definition: Array_initializer_list_vector_cxx11.cpp:1
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
#define EIGEN_ONLY_USED_FOR_DEBUG(x)
Definition: Macros.h:922
#define eigen_assert(x)
Definition: Macros.h:910
#define EIGEN_STRONG_INLINE
Definition: Macros.h:834
#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar, Size)
Definition: Memory.h:880
Map< RowVectorXf > v2(M2.data(), M2.size())
M1<< 1, 2, 3, 4, 5, 6, 7, 8, 9;Map< RowVectorXf > v1(M1.data(), M1.size())
SCALAR Scalar
Definition: bench_gemm.cpp:45
An axis aligned box.
Definition: AlignedBox.h:69
A simple bounding volume hierarchy based on AlignedBox.
Definition: KdBVH.h:68
std::vector< VIPair, aligned_allocator< VIPair > > VIPairList
Definition: KdBVH.h:174
const Object * ObjectIterator
Definition: KdBVH.h:78
Matrix< Scalar, Dim, 1 > VectorType
Definition: KdBVH.h:175
std::vector< Object, aligned_allocator< Object > > ObjectList
Definition: KdBVH.h:72
void init(Iter begin, Iter end)
Definition: KdBVH.h:99
AlignedBox< Scalar, Dim > Volume
Definition: KdBVH.h:74
_Object Object
Definition: KdBVH.h:71
KdBVH(OIter begin, OIter end, BIter boxBegin, BIter boxEnd)
Definition: KdBVH.h:92
KdBVH(Iter begin, Iter end)
Definition: KdBVH.h:85
const Volume & getVolume(Index index) const
Definition: KdBVH.h:170
KdBVH()
Definition: KdBVH.h:80
internal::vector_int_pair< Scalar, Dim > VIPair
Definition: KdBVH.h:173
void init(OIter begin, OIter end, BIter boxBegin, BIter boxEnd)
Definition: KdBVH.h:106
ObjectList objects
Definition: KdBVH.h:218
Scalar_ Scalar
Definition: KdBVH.h:73
Index getRootIndex() const
Definition: KdBVH.h:136
const int * VolumeIterator
Definition: KdBVH.h:77
void build(VIPairList &objCenters, int from, int to, const VolumeList &objBoxes, int dim)
Definition: KdBVH.h:186
int Index
Definition: KdBVH.h:76
@ Dim
Definition: KdBVH.h:70
EIGEN_STRONG_INLINE void getChildren(Index index, VolumeIterator &outVBegin, VolumeIterator &outVEnd, ObjectIterator &outOBegin, ObjectIterator &outOEnd) const
Definition: KdBVH.h:140
VolumeList boxes
Definition: KdBVH.h:217
std::vector< int > children
Definition: KdBVH.h:215
std::vector< Volume, aligned_allocator< Volume > > VolumeList
Definition: KdBVH.h:75
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void swap(DenseBase< OtherDerived > &other)
Override DenseBase::swap() since for dynamic-sized matrices of same type it is enough to swap the dat...
Definition: PlainObjectBase.h:898
static constexpr lastp1_t end
Definition: IndexedViewHelper.h:79
Eigen::Matrix< Scalar, Dynamic, Dynamic, ColMajor > tmp
Definition: level3_impl.h:365
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
Box2d bounding_box(const Vector2d &v)
Definition: BVH_Example.cpp:9
static const unsigned Dim
Problem dimension.
Definition: two_d_tilted_square.cc:62
Definition: Eigen_Colamd.h:49
int dim
Definition: KdBVH.h:180
VectorComparator(int inDim)
Definition: KdBVH.h:178
bool operator()(const VIPair &v1, const VIPair &v2) const
Definition: KdBVH.h:179
void operator()(const ObjectList &objects, int, int, VolumeList &outBoxes)
Definition: KdBVH.h:45
void operator()(const ObjectList &objects, BoxIter boxBegin, BoxIter boxEnd, VolumeList &outBoxes)
Definition: KdBVH.h:36
VectorType first
Definition: KdBVH.h:28
int second
Definition: KdBVH.h:29