13#ifndef IGL_WINDINGNUMBERAABB_H
14#define IGL_WINDINGNUMBERAABB_H
50 template <
typename DerivedV,
typename DerivedF>
52 const Eigen::MatrixBase<DerivedV> & V,
53 const Eigen::MatrixBase<DerivedF> &
F);
61 template <
typename DerivedV,
typename DerivedF>
63 const Eigen::MatrixBase<DerivedV> & V,
64 const Eigen::MatrixBase<DerivedF> &
F);
67 inline virtual void grow();
90#ifndef WindingNumberAABB_MIN_F
91# define WindingNumberAABB_MIN_F 100
94template <
typename Scalar,
typename Index>
95 template <
typename DerivedV,
typename DerivedF>
97 const Eigen::MatrixBase<DerivedV> & V,
98 const Eigen::MatrixBase<DerivedF> &
F)
102 DerivedF::ColsAtCompileTime == 3 || DerivedF::ColsAtCompileTime == Eigen::Dynamic,
103 "F should have 3 or Dynamic columns");
108template <
typename Scalar,
typename Index>
114 Eigen::Matrix<Scalar,Eigen::Dynamic,1> dblA;
119template <
typename Scalar,
typename Index>
120template <
typename DerivedV,
typename DerivedF>
122 const Eigen::MatrixBase<DerivedV> & V,
123 const Eigen::MatrixBase<DerivedF> &
F):
128 std::numeric_limits<Scalar>::infinity()),
134template <
typename Scalar,
typename Index>
142 std::numeric_limits<Scalar>::infinity()),
148template <
typename Scalar,
typename Index>
159 (this->
F).rows() <= (WindingNumberAABB_MIN_F>0?WindingNumberAABB_MIN_F:0) ||
160 ((this->
cap).rows() - 2) >= (this->
F).rows())
169 -std::numeric_limits<Scalar>::infinity();
179 Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> BC;
191 median(BC.col(max_d),split_value);
202 std::vector<int> id( (this->
F).rows());
203 for(
int i = 0;i<(this->
F).rows();i++)
205 if(BC(i,max_d) <= split_value)
214 const int lefts = (int)
count(
id.begin(),
id.end(),0);
215 const int rights = (int)
count(
id.begin(),
id.end(),1);
216 if(lefts == 0 || rights == 0)
221 assert(lefts+rights == (this->
F).rows());
223 MatrixXF rightF(rights,(this->
F).cols());
226 for(
int i = 0;i<(this->
F).rows();i++)
230 leftF.row(left_i++) = (this->
F).row(i);
233 rightF.row(right_i++) = (this->
F).row(i);
239 assert(right_i == rightF.rows());
240 assert(left_i == leftF.rows());
244 leftWindingNumberAABB->
grow();
245 this->
children.push_back(leftWindingNumberAABB);
248 rightWindingNumberAABB->
grow();
249 this->
children.push_back(rightWindingNumberAABB);
252template <
typename Scalar,
typename Index>
257 for(
int i = 0;i<p.size();i++)
270template <
typename Scalar,
typename Index>
276 min_corner[d] = std::numeric_limits<typename Point::Scalar>::infinity();
277 max_corner[d] = -std::numeric_limits<typename Point::Scalar>::infinity();
282 for(
int i = 0;i<(this->
F).rows();i++)
284 for(
int j = 0;j<(this->
F).cols();j++)
301 this->
center.array() /= (this->
F).size();
312template <
typename Scalar,
typename Index>
319 return std::numeric_limits<Scalar>::infinity();
323 return std::numeric_limits<Scalar>::infinity();
326template <
typename Scalar,
typename Index>
329 const Point & p)
const
334 return std::numeric_limits<Scalar>::infinity();
342 Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic>
345 Eigen::Matrix<Index,Eigen::Dynamic,Eigen::Dynamic>
379 for(
int i = 0;i<BFN.rows();i++)
381 if(p2c.dot(BFN.row(i)) > 0)
383 PBF.row(pbfi++) = BF.row(i);
386 PBF.conservativeResize(pbfi,PBF.cols());
Point max_corner
Definition WindingNumberAABB.h:32
virtual void grow()
Definition WindingNumberAABB.h:149
typename WindingNumberTree< Scalar, Index >::MatrixXF MatrixXF
Definition WindingNumberAABB.h:30
Scalar max_simple_abs_winding_number(const Point &p) const
Definition WindingNumberAABB.h:328
enum igl::WindingNumberAABB::SplitMethod split_method
bool inside(const Point &p) const
Definition WindingNumberAABB.h:253
Scalar total_positive_area
Definition WindingNumberAABB.h:33
SplitMethod
Definition WindingNumberAABB.h:36
@ MEDIAN_ON_LONGEST_AXIS
Definition WindingNumberAABB.h:38
@ NUM_SPLIT_METHODS
Definition WindingNumberAABB.h:39
@ CENTER_ON_LONGEST_AXIS
Definition WindingNumberAABB.h:37
WindingNumberAABB()
Definition WindingNumberAABB.h:42
void compute_min_max_corners()
Definition WindingNumberAABB.h:271
Scalar max_abs_winding_number(const Point &p) const
Definition WindingNumberAABB.h:314
void init()
Definition WindingNumberAABB.h:109
Point min_corner
Definition WindingNumberAABB.h:31
void set_mesh(const Eigen::MatrixBase< DerivedV > &V, const Eigen::MatrixBase< DerivedF > &F)
Initialize the hierarchy to a given mesh.
Definition WindingNumberAABB.h:96
typename WindingNumberTree< Scalar, Index >::Point Point
Definition WindingNumberAABB.h:29
Space partitioning tree for computing winding number hierarchically.
Definition WindingNumberTree.h:24
std::list< WindingNumberTree * > children
Definition WindingNumberTree.h:36
std::shared_ptr< MatrixXS > Vptr
Definition WindingNumberTree.h:47
MatrixXF cap
Definition WindingNumberTree.h:51
void delete_children()
Definition WindingNumberTree.h:225
Eigen::Matrix< Index, Eigen::Dynamic, Eigen::Dynamic > MatrixXF
Definition WindingNumberTree.h:42
void set_mesh(const Eigen::MatrixBase< DerivedV > &V, const Eigen::MatrixBase< DerivedF > &F)
Definition WindingNumberTree.h:184
MatrixXF F
Definition WindingNumberTree.h:49
WindingNumberTree()
Definition WindingNumberTree.h:155
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > MatrixXS
Definition WindingNumberTree.h:39
Point center
Definition WindingNumberTree.h:55
Eigen::Matrix< Scalar, 1, 3 > Point
Definition WindingNumberTree.h:26
Scalar radius
Definition WindingNumberTree.h:53
const WindingNumberTree * parent
Definition WindingNumberTree.h:35
void per_face_normals(const Eigen::MatrixBase< DerivedV > &V, const Eigen::MatrixBase< DerivedF > &F, const Eigen::MatrixBase< DerivedZ > &Z, Eigen::PlainObjectBase< DerivedN > &N)
Compute face normals via vertex position list, face list.
void winding_number(const Eigen::MatrixBase< DerivedV > &V, const Eigen::MatrixBase< DerivedF > &F, const Eigen::MatrixBase< DerivedO > &O, Eigen::PlainObjectBase< DerivedW > &W)
Computes the generalized winding number at each dim-dimensional query point in O with respect to the ...
void doublearea(const Eigen::MatrixBase< DerivedV > &V, const Eigen::MatrixBase< DerivedF > &F, Eigen::PlainObjectBase< DeriveddblA > &dblA)
Computes twice the area for each input triangle or quad.
void count(const Eigen::SparseMatrix< XType > &X, const int dim, Eigen::SparseVector< SType > &S)
Count the number of non-zeros in the columns or rows of a sparse matrix.
void barycenter(const Eigen::MatrixBase< DerivedV > &V, const Eigen::MatrixBase< DerivedF > &F, Eigen::PlainObjectBase< DerivedBC > &BC)
Computes the barycenter of every simplex.
bool median(const Eigen::MatrixBase< DerivedV > &V, mType &m)
Compute the median of an eigen vector.
Definition PlainMatrix.h:18