#include "eytzinger_aabb.h" #include "PlainMatrix.h" #include "median.h" #include #include template < typename DerivedPB, typename DerivedB, typename Derivedleaf > IGL_INLINE void igl::eytzinger_aabb( const Eigen::MatrixBase & PB1, const Eigen::MatrixBase & PB2, Eigen::PlainObjectBase & B1, Eigen::PlainObjectBase & B2, Eigen::PlainObjectBase & leaf) { using Scalar = typename DerivedPB::Scalar; using VectorXS = Eigen::Matrix; // Number of primitives const int m = PB1.rows(); assert(PB1.rows() == PB2.rows()); if(m==0) { B1.resize(0,PB1.cols()); B2.resize(0,PB2.cols()); leaf.resize(0); return; } const PlainMatrix PBC = (PB1 + PB2) / 2; const int complete_m = 1 << ((int)std::ceil(std::log2(m))+1); B1.resize(complete_m, PB1.cols()); B2.resize(complete_m, PB2.cols()); leaf.resize(complete_m); leaf.setConstant(-2); std::vector I(m); for(int i = 0; i < m; i++) { I[i] = i; } std::function &)> recursive_helper; recursive_helper = [&](const int i, const std::vector & I) { if(I.size() == 0) { return; } B1.row(i) = PB1(I, Eigen::all).colwise().minCoeff(); B2.row(i) = PB2(I, Eigen::all).colwise().maxCoeff(); if(I.size() == 1) { leaf(i) = I[0]; return; } leaf(i) = -1; int dir; (B2.row(i) - B1.row(i)).maxCoeff(&dir); Scalar split_value; VectorXS Z = PBC(I, dir); igl::median(Z,split_value); std::vector left; left.reserve(I.size()/2+1); std::vector right; right.reserve(I.size()/2+1); for(int j = 0; j < (int)I.size(); j++) { if(Z(j) < split_value) { left.push_back(I[j]); }else if(Z(j) > split_value) { right.push_back(I[j]); } } for(int j = 0; j < (int)I.size(); j++) { if(Z(j) == split_value) { (left.size(), Eigen::Matrix, Eigen::Matrix>(Eigen::MatrixBase> const&, Eigen::MatrixBase> const&, Eigen::PlainObjectBase>&, Eigen::PlainObjectBase>&, Eigen::PlainObjectBase>&); template void igl::eytzinger_aabb, Eigen::Matrix, Eigen::Matrix>(Eigen::MatrixBase> const&, Eigen::MatrixBase> const&, Eigen::PlainObjectBase>&, Eigen::PlainObjectBase>&, Eigen::PlainObjectBase>&); #endif