8#ifndef IGL_WINDINGNUMBERTREE_H
9#define IGL_WINDINGNUMBERTREE_H
26 using Point = Eigen::Matrix<Scalar,1,3>;
30 std::pair<const WindingNumberTree*,const WindingNumberTree*>,
38 Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic>
41 Eigen::Matrix<Index,Eigen::Dynamic,Eigen::Dynamic>
47 std::shared_ptr<MatrixXS>
Vptr;
59 template <
typename DerivedV,
typename DerivedF>
61 const Eigen::MatrixBase<DerivedV> & V,
62 const Eigen::MatrixBase<DerivedF> &
F);
69 template <
typename DerivedV,
typename DerivedF>
71 const Eigen::MatrixBase<DerivedV> & V,
72 const Eigen::MatrixBase<DerivedF> &
F);
77 inline virtual void grow();
112 inline void print(
const char * tab=
"");
150template <
typename Scalar,
typename Index>
154template <
typename Scalar,
typename Index>
161 radius(
std::numeric_limits<Scalar>::infinity()),
166template <
typename Scalar,
typename Index>
167template <
typename DerivedV,
typename DerivedF>
169 const Eigen::MatrixBase<DerivedV> & _V,
170 const Eigen::MatrixBase<DerivedF> & _F):
176 radius(
std::numeric_limits<Scalar>::infinity()),
182template <
typename Scalar,
typename Index>
183template <
typename DerivedV,
typename DerivedF>
185 const Eigen::MatrixBase<DerivedV> & _V,
186 const Eigen::MatrixBase<DerivedF> & _F)
191 Eigen::Matrix<typename MatrixXF::Scalar,Eigen::Dynamic,1> SVI,SVJ;
194 Eigen::Matrix<typename MatrixXF::Scalar,Eigen::Dynamic,2> EE;
199 Vptr = std::make_shared<MatrixXS>(
SV);
202template <
typename Scalar,
typename Index>
213 Eigen::Matrix<typename MatrixXF::Scalar,Eigen::Dynamic,2> EE;
218template <
typename Scalar,
typename Index>
224template <
typename Scalar,
typename Index>
228 typename std::list<WindingNumberTree<Scalar,Index>* >::iterator cit =
children.begin();
238template <
typename Scalar,
typename Index>
244 child->set_method(m);
248template <
typename Scalar,
typename Index>
255template <
typename Scalar,
typename Index>
261template <
typename Scalar,
typename Index>
282 sum += (*cit)->winding_number(p);
288 sum += (*cit)->winding_number(p);
305 if((
cap.rows() - 2) <
F.rows())
313 Scalar dist = (p-
center).norm();
325 return parent->cached_winding_number(*
this,p);
327 default: assert(
false);
break;
338template <
typename Scalar,
typename Index>
345template <
typename Scalar,
typename Index>
368template <
typename Scalar,
typename Index>
372 std::cout<<tab<<
"["<<std::endl<<
F<<std::endl<<
"]";
379 std::cout<<
","<<std::endl;
380 (*cit)->print((std::string(tab)+
"").c_str());
384template <
typename Scalar,
typename Index>
388 return std::numeric_limits<Scalar>::infinity();
391template <
typename Scalar,
typename Index>
394 const Point & )
const
396 return std::numeric_limits<Scalar>::infinity();
399template <
typename Scalar,
typename Index>
403 const Point & p)
const
426 that.
radius - this->radius,
427 (that.
center - this->center).norm());
435 std::pair<const WindingNumberTree*,const WindingNumberTree*> this_that(
this,&that);
437 if(
cached.count(this_that)==0)
454 if((*cit)->inside(p))
456 return (*cit)->cached_winding_number(that,p);
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
WindingNumberMethod method
Definition WindingNumberTree.h:34
MatrixXF cap
Definition WindingNumberTree.h:51
virtual Scalar max_simple_abs_winding_number(const Point &p) const
Definition WindingNumberTree.h:393
virtual ~WindingNumberTree()
Definition WindingNumberTree.h:219
virtual Scalar max_abs_winding_number(const Point &p) const
Definition WindingNumberTree.h:386
void delete_children()
Definition WindingNumberTree.h:225
Eigen::Matrix< Index, Eigen::Dynamic, Eigen::Dynamic > MatrixXF
Definition WindingNumberTree.h:42
void set_method(const WindingNumberMethod &m)
Definition WindingNumberTree.h:239
Scalar winding_number_all(const Point &p) const
Definition WindingNumberTree.h:340
static std::map< std::pair< const WindingNumberTree *, const WindingNumberTree * >, Scalar > cached
Definition WindingNumberTree.h:32
void set_mesh(const Eigen::MatrixBase< DerivedV > &V, const Eigen::MatrixBase< DerivedF > &F)
Definition WindingNumberTree.h:184
virtual bool inside(const Point &p) const
Definition WindingNumberTree.h:256
void print(const char *tab="")
Definition WindingNumberTree.h:369
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
MatrixXS SV
Definition WindingNumberTree.h:45
virtual Scalar cached_winding_number(const WindingNumberTree &that, const Point &p) const
Definition WindingNumberTree.h:401
Eigen::Matrix< Scalar, 1, 3 > Point
Definition WindingNumberTree.h:26
Scalar winding_number(const Point &p) const
Definition WindingNumberTree.h:263
Scalar winding_number_boundary(const Point &p) const
Definition WindingNumberTree.h:347
virtual void grow()
Definition WindingNumberTree.h:249
Scalar radius
Definition WindingNumberTree.h:53
const WindingNumberTree * parent
Definition WindingNumberTree.h:35
void remove_duplicate_vertices(const Eigen::MatrixBase< DerivedV > &V, const double epsilon, Eigen::PlainObjectBase< DerivedSV > &SV, Eigen::PlainObjectBase< DerivedSVI > &SVI, Eigen::PlainObjectBase< DerivedSVJ > &SVJ)
Remove duplicate vertices upto a uniqueness tolerance (epsilon).
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 ...
WindingNumberMethod
Definition WindingNumberMethod.h:13
@ APPROX_SIMPLE_WINDING_NUMBER_METHOD
Definition WindingNumberMethod.h:17
@ APPROX_CACHE_WINDING_NUMBER_METHOD
Definition WindingNumberMethod.h:19
@ EXACT_WINDING_NUMBER_METHOD
Definition WindingNumberMethod.h:15
void exterior_edges(const Eigen::MatrixBase< DerivedF > &F, Eigen::PlainObjectBase< DerivedE > &E)
Determines boundary "edges" and also edges with an odd number of occurrences where seeing edge (i,...
void triangle_fan(const Eigen::MatrixBase< DerivedE > &E, Eigen::PlainObjectBase< Derivedcap > &cap)
Given a list of faces tessellate all of the "exterior" edges forming another list of.
void sum(const Eigen::SparseMatrix< T > &X, const int dim, Eigen::SparseVector< T > &S)
Sum the columns or rows of a sparse matrix.
constexpr double PI
π
Definition PI.h:18
Definition PlainMatrix.h:18