Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
igl::WindingNumberTree< Point, DerivedV, DerivedF > Class Template Reference

#include <src/libigl/igl/WindingNumberTree.h>

+ Inheritance diagram for igl::WindingNumberTree< Point, DerivedV, DerivedF >:
+ Collaboration diagram for igl::WindingNumberTree< Point, DerivedV, DerivedF >:

Public Member Functions

 WindingNumberTree ()
 
 WindingNumberTree (const Eigen::MatrixBase< DerivedV > &V, const Eigen::MatrixBase< DerivedF > &F)
 
 WindingNumberTree (const WindingNumberTree< Point, DerivedV, DerivedF > &parent, const Eigen::MatrixBase< DerivedF > &F)
 
virtual ~WindingNumberTree ()
 
void delete_children ()
 
virtual void set_mesh (const Eigen::MatrixBase< DerivedV > &V, const Eigen::MatrixBase< DerivedF > &F)
 
void set_method (const WindingNumberMethod &m)
 
const DerivedV & getV () const
 
const MatrixXFgetF () const
 
const MatrixXFgetcap () const
 
virtual void grow ()
 
virtual bool inside (const Point &p) const
 
DerivedV::Scalar winding_number (const Point &p) const
 
DerivedV::Scalar winding_number_all (const Point &p) const
 
DerivedV::Scalar winding_number_boundary (const Point &p) const
 
void print (const char *tab="")
 
virtual DerivedV::Scalar max_abs_winding_number (const Point &p) const
 
virtual DerivedV::Scalar max_simple_abs_winding_number (const Point &p) const
 
virtual DerivedV::Scalar cached_winding_number (const WindingNumberTree &that, const Point &p) const
 

Static Public Attributes

static std::map< std::pair< const WindingNumberTree *, const WindingNumberTree * >, typename DerivedV::Scalar > cached
 
static DerivedV dummyV
 

Protected Types

typedef Eigen::Matrix< typename DerivedV::Scalar, Eigen::Dynamic, Eigen::DynamicMatrixXS
 
typedef Eigen::Matrix< typename DerivedF::Scalar, Eigen::Dynamic, Eigen::DynamicMatrixXF
 

Protected Attributes

WindingNumberMethod method
 
const WindingNumberTreeparent
 
std::list< WindingNumberTree * > children
 
DerivedV & V
 
MatrixXS SV
 
MatrixXF F
 
MatrixXF cap
 
DerivedV::Scalar radius
 
Point center
 

Detailed Description

template<typename Point, typename DerivedV, typename DerivedF>
class igl::WindingNumberTree< Point, DerivedV, DerivedF >

Member Typedef Documentation

◆ MatrixXF

template<typename Point , typename DerivedV , typename DerivedF >
typedef Eigen::Matrix<typename DerivedF::Scalar,Eigen::Dynamic,Eigen::Dynamic> igl::WindingNumberTree< Point, DerivedV, DerivedF >::MatrixXF
protected

◆ MatrixXS

template<typename Point , typename DerivedV , typename DerivedF >
typedef Eigen::Matrix<typename DerivedV::Scalar,Eigen::Dynamic,Eigen::Dynamic> igl::WindingNumberTree< Point, DerivedV, DerivedF >::MatrixXS
protected

Constructor & Destructor Documentation

◆ WindingNumberTree() [1/3]

template<typename Point , typename DerivedV , typename DerivedF >
igl::WindingNumberTree< Point, DerivedV, DerivedF >::WindingNumberTree
inline
161 :
163 parent(NULL),
164 V(dummyV),
165 SV(),
166 F(),
167 //boundary(igl::boundary_facets<Eigen::MatrixXi,Eigen::MatrixXi>(F))
168 cap(),
169 radius(std::numeric_limits<typename DerivedV::Scalar>::infinity()),
170 center(0,0,0)
171{
172}
const WindingNumberTree * parent
Definition WindingNumberTree.h:39
DerivedV & V
Definition WindingNumberTree.h:50
WindingNumberMethod method
Definition WindingNumberTree.h:38
MatrixXF cap
Definition WindingNumberTree.h:56
DerivedV::Scalar radius
Definition WindingNumberTree.h:58
Point center
Definition WindingNumberTree.h:60
MatrixXF F
Definition WindingNumberTree.h:54
MatrixXS SV
Definition WindingNumberTree.h:52
static DerivedV dummyV
Definition WindingNumberTree.h:36
@ EXACT_WINDING_NUMBER_METHOD
Definition WindingNumberMethod.h:17

References igl::EXACT_WINDING_NUMBER_METHOD.

◆ WindingNumberTree() [2/3]

template<typename Point , typename DerivedV , typename DerivedF >
igl::WindingNumberTree< Point, DerivedV, DerivedF >::WindingNumberTree ( const Eigen::MatrixBase< DerivedV > &  V,
const Eigen::MatrixBase< DerivedF > &  F 
)
inline
177 :
179 parent(NULL),
180 V(dummyV),
181 SV(),
182 F(),
183 //boundary(igl::boundary_facets<Eigen::MatrixXi,Eigen::MatrixXi>(F))
184 cap(),
185 radius(std::numeric_limits<typename DerivedV::Scalar>::infinity()),
186 center(0,0,0)
187{
188 set_mesh(_V,_F);
189}
virtual void set_mesh(const Eigen::MatrixBase< DerivedV > &V, const Eigen::MatrixBase< DerivedF > &F)
Definition WindingNumberTree.h:192

References igl::WindingNumberTree< Point, DerivedV, DerivedF >::set_mesh().

+ Here is the call graph for this function:

◆ WindingNumberTree() [3/3]

template<typename Point , typename DerivedV , typename DerivedF >
igl::WindingNumberTree< Point, DerivedV, DerivedF >::WindingNumberTree ( const WindingNumberTree< Point, DerivedV, DerivedF > &  parent,
const Eigen::MatrixBase< DerivedF > &  F 
)
inline
209 :
211 parent(&parent),
212 V(parent.V),
213 SV(),
214 F(_F),
216{
217}
IGL_INLINE void exterior_edges(const Eigen::MatrixXi &F, Eigen::MatrixXi &E)
Definition exterior_edges.cpp:44
IGL_INLINE void triangle_fan(const Eigen::MatrixXi &E, Eigen::MatrixXi &cap)
Definition triangle_fan.cpp:12

◆ ~WindingNumberTree()

template<typename Point , typename DerivedV , typename DerivedF >
igl::WindingNumberTree< Point, DerivedV, DerivedF >::~WindingNumberTree
inlinevirtual
221{
223}
void delete_children()
Definition WindingNumberTree.h:226

Member Function Documentation

◆ cached_winding_number()

template<typename Point , typename DerivedV , typename DerivedF >
DerivedV::Scalar igl::WindingNumberTree< Point, DerivedV, DerivedF >::cached_winding_number ( const WindingNumberTree< Point, DerivedV, DerivedF > &  that,
const Point p 
) const
inlinevirtual
431{
432 using namespace std;
433 // Simple metric for `is_far`
434 //
435 // this that
436 // --------
437 // ----- / | \ .
438 // / r \ / R \ .
439 // | p ! | | ! |
440 // \_____/ \ /
441 // \________/
442 //
443 //
444 // a = angle formed by trapazoid formed by raising sides with lengths r and R
445 // at respective centers.
446 //
447 // a = atan2(R-r,d), where d is the distance between centers
448
449 // That should be bigger (what about parent? what about sister?)
450 bool is_far = this->radius<that.radius;
451 if(is_far)
452 {
453 typename DerivedV::Scalar a = atan2(
454 that.radius - this->radius,
455 (that.center - this->center).norm());
456 assert(a>0);
457 is_far = (a<PI/8.0);
458 }
459
460 if(is_far)
461 {
462 // Not implemented yet
463 pair<const WindingNumberTree*,const WindingNumberTree*> this_that(this,&that);
464 // Need to compute it for first time?
465 if(cached.count(this_that)==0)
466 {
467 cached[this_that] =
468 that.winding_number_boundary(this->center);
469 }
470 return cached[this_that];
471 }else if(children.size() == 0)
472 {
473 // not far and hierarchy ended too soon: can't use cache
474 return that.winding_number_boundary(p);
475 }else
476 {
477 for(
478 typename list<WindingNumberTree<Point,DerivedV,DerivedF>* >::const_iterator cit = children.begin();
479 cit != children.end();
480 cit++)
481 {
482 if((*cit)->inside(p))
483 {
484 return (*cit)->cached_winding_number(that,p);
485 }
486 }
487 // Not inside any children? This can totally happen because bounding boxes
488 // are set to bound contained facets. So sibilings may overlap and their
489 // union may not contain their parent (though, their union is certainly a
490 // subset of their parent).
491 assert(false);
492 }
493 return 0;
494}
std::list< WindingNumberTree * > children
Definition WindingNumberTree.h:40
static std::map< std::pair< const WindingNumberTree *, const WindingNumberTree * >, typename DerivedV::Scalar > cached
Definition WindingNumberTree.h:33
const double PI
Definition PI.h:16
STL namespace.

References igl::WindingNumberTree< Point, DerivedV, DerivedF >::center, igl::PI, igl::WindingNumberTree< Point, DerivedV, DerivedF >::radius, and igl::WindingNumberTree< Point, DerivedV, DerivedF >::winding_number_boundary().

+ Here is the call graph for this function:

◆ delete_children()

template<typename Point , typename DerivedV , typename DerivedF >
void igl::WindingNumberTree< Point, DerivedV, DerivedF >::delete_children
inline
227{
228 using namespace std;
229 // Delete children
230 typename list<WindingNumberTree<Point,DerivedV,DerivedF>* >::iterator cit = children.begin();
231 while(cit != children.end())
232 {
233 // clear the memory of this item
234 delete (* cit);
235 // erase from list, returns next element in iterator
236 cit = children.erase(cit);
237 }
238}

◆ getcap()

template<typename Point , typename DerivedV , typename DerivedF >
const igl::WindingNumberTree< Point, DerivedV, DerivedF >::MatrixXF & igl::WindingNumberTree< Point, DerivedV, DerivedF >::getcap
inline
266{
267 return cap;
268}

◆ getF()

template<typename Point , typename DerivedV , typename DerivedF >
const igl::WindingNumberTree< Point, DerivedV, DerivedF >::MatrixXF & igl::WindingNumberTree< Point, DerivedV, DerivedF >::getF
inline
259{
260 return F;
261}

◆ getV()

template<typename Point , typename DerivedV , typename DerivedF >
const DerivedV & igl::WindingNumberTree< Point, DerivedV, DerivedF >::getV
inline
252{
253 return V;
254}

◆ grow()

template<typename Point , typename DerivedV , typename DerivedF >
void igl::WindingNumberTree< Point, DerivedV, DerivedF >::grow
inlinevirtual

Reimplemented in igl::WindingNumberAABB< Point, DerivedV, DerivedF >.

272{
273 // Don't grow
274 return;
275}

◆ inside()

template<typename Point , typename DerivedV , typename DerivedF >
bool igl::WindingNumberTree< Point, DerivedV, DerivedF >::inside ( const Point p) const
inlinevirtual

Reimplemented in igl::WindingNumberAABB< Point, DerivedV, DerivedF >.

279{
280 return true;
281}

◆ max_abs_winding_number()

template<typename Point , typename DerivedV , typename DerivedF >
DerivedV::Scalar igl::WindingNumberTree< Point, DerivedV, DerivedF >::max_abs_winding_number ( const Point p) const
inlinevirtual

Reimplemented in igl::WindingNumberAABB< Point, DerivedV, DerivedF >.

413{
414 return std::numeric_limits<typename DerivedV::Scalar>::infinity();
415}

◆ max_simple_abs_winding_number()

template<typename Point , typename DerivedV , typename DerivedF >
DerivedV::Scalar igl::WindingNumberTree< Point, DerivedV, DerivedF >::max_simple_abs_winding_number ( const Point p) const
inlinevirtual

Reimplemented in igl::WindingNumberAABB< Point, DerivedV, DerivedF >.

421{
422 using namespace std;
423 return numeric_limits<typename DerivedV::Scalar>::infinity();
424}

◆ print()

template<typename Point , typename DerivedV , typename DerivedF >
void igl::WindingNumberTree< Point, DerivedV, DerivedF >::print ( const char *  tab = "")
inline
395{
396 using namespace std;
397 // Print all facets
398 cout<<tab<<"["<<endl<<F<<endl<<"]";
399 // Print children
400 for(
401 typename list<WindingNumberTree<Point,DerivedV,DerivedF>* >::iterator cit = children.begin();
402 cit != children.end();
403 cit++)
404 {
405 cout<<","<<endl;
406 (*cit)->print((string(tab)+"").c_str());
407 }
408}

◆ set_mesh()

template<typename Point , typename DerivedV , typename DerivedF >
void igl::WindingNumberTree< Point, DerivedV, DerivedF >::set_mesh ( const Eigen::MatrixBase< DerivedV > &  V,
const Eigen::MatrixBase< DerivedF > &  F 
)
inlinevirtual

Reimplemented in igl::WindingNumberAABB< Point, DerivedV, DerivedF >.

195{
196 using namespace std;
197 // Remove any exactly duplicate vertices
198 // Q: Can this ever increase the complexity of the boundary?
199 // Q: Would we gain even more by remove almost exactly duplicate vertices?
200 MatrixXF SF,SVI,SVJ;
201 igl::remove_duplicate_vertices(_V,_F,0.0,SV,SVI,SVJ,F);
203 V = SV;
204}
Eigen::Matrix< typename DerivedF::Scalar, Eigen::Dynamic, Eigen::Dynamic > MatrixXF
Definition WindingNumberTree.h:46
IGL_INLINE void remove_duplicate_vertices(const Eigen::MatrixBase< DerivedV > &V, const double epsilon, Eigen::PlainObjectBase< DerivedSV > &SV, Eigen::PlainObjectBase< DerivedSVI > &SVI, Eigen::PlainObjectBase< DerivedSVJ > &SVJ)
Definition remove_duplicate_vertices.cpp:20

References igl::exterior_edges(), igl::remove_duplicate_vertices(), and igl::triangle_fan().

Referenced by igl::WindingNumberTree< Point, DerivedV, DerivedF >::WindingNumberTree(), and igl::WindingNumberAABB< Point, DerivedV, DerivedF >::set_mesh().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ set_method()

template<typename Point , typename DerivedV , typename DerivedF >
void igl::WindingNumberTree< Point, DerivedV, DerivedF >::set_method ( const WindingNumberMethod m)
inline
242{
243 this->method = m;
244 for(auto child : children)
245 {
246 child->set_method(m);
247 }
248}

◆ winding_number()

template<typename Point , typename DerivedV , typename DerivedF >
DerivedV::Scalar igl::WindingNumberTree< Point, DerivedV, DerivedF >::winding_number ( const Point p) const
inline
286{
287 using namespace std;
288 //cout<<"+"<<boundary.rows();
289 // If inside then we need to be careful
290 if(inside(p))
291 {
292 // If not a leaf then recurse
293 if(children.size()>0)
294 {
295 // Recurse on each child and accumulate
296 typename DerivedV::Scalar sum = 0;
297 for(
298 typename list<WindingNumberTree<Point,DerivedV,DerivedF>* >::const_iterator cit = children.begin();
299 cit != children.end();
300 cit++)
301 {
302 switch(method)
303 {
305 sum += (*cit)->winding_number(p);
306 break;
309 //if((*cit)->max_simple_abs_winding_number(p) > min_max_w)
310 //{
311 sum += (*cit)->winding_number(p);
312 //}
313 break;
314 default:
315 assert(false);
316 break;
317 }
318 }
319 return sum;
320 }else
321 {
322 return winding_number_all(p);
323 }
324 }else{
325 // Otherwise we can just consider boundary
326 // Q: If we using the "multipole" method should we also subdivide the
327 // boundary case?
328 if((cap.rows() - 2) < F.rows())
329 {
330 switch(method)
331 {
333 return winding_number_boundary(p);
335 {
336 typename DerivedV::Scalar dist = (p-center).norm();
337 // Radius is already an overestimate of inside
338 if(dist>1.0*radius)
339 {
340 return 0;
341 }else
342 {
343 return winding_number_boundary(p);
344 }
345 }
347 {
348 return parent->cached_winding_number(*this,p);
349 }
350 default: assert(false);break;
351 }
352 }else
353 {
354 // doesn't pay off to use boundary
355 return winding_number_all(p);
356 }
357 }
358 return 0;
359}
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rows() const
Definition PlainObjectBase.h:151
virtual bool inside(const Point &p) const
Definition WindingNumberTree.h:278
virtual DerivedV::Scalar cached_winding_number(const WindingNumberTree &that, const Point &p) const
Definition WindingNumberTree.h:428
DerivedV::Scalar winding_number_all(const Point &p) const
Definition WindingNumberTree.h:363
DerivedV::Scalar winding_number_boundary(const Point &p) const
Definition WindingNumberTree.h:370
T dist(const boost::polygon::point_data< T > &p1, const boost::polygon::point_data< T > &p2)
Definition Geometry.cpp:280
@ APPROX_SIMPLE_WINDING_NUMBER_METHOD
Definition WindingNumberMethod.h:18
@ APPROX_CACHE_WINDING_NUMBER_METHOD
Definition WindingNumberMethod.h:19
IGL_INLINE void sum(const Eigen::SparseMatrix< T > &X, const int dim, Eigen::SparseVector< T > &S)
Definition sum.cpp:12

References igl::APPROX_CACHE_WINDING_NUMBER_METHOD, igl::APPROX_SIMPLE_WINDING_NUMBER_METHOD, igl::EXACT_WINDING_NUMBER_METHOD, and igl::sum().

Referenced by igl::signed_distance(), and igl::signed_distance_winding_number().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ winding_number_all()

template<typename Point , typename DerivedV , typename DerivedF >
DerivedV::Scalar igl::WindingNumberTree< Point, DerivedV, DerivedF >::winding_number_all ( const Point p) const
inline
364{
365 return igl::winding_number(V,F,p);
366}
IGL_INLINE void winding_number(const Eigen::MatrixBase< DerivedV > &V, const Eigen::MatrixBase< DerivedF > &F, const Eigen::MatrixBase< DerivedO > &O, Eigen::PlainObjectBase< DerivedW > &W)
Definition winding_number.cpp:22

References igl::winding_number().

+ Here is the call graph for this function:

◆ winding_number_boundary()

template<typename Point , typename DerivedV , typename DerivedF >
DerivedV::Scalar igl::WindingNumberTree< Point, DerivedV, DerivedF >::winding_number_boundary ( const Point p) const
inline
371{
372 using namespace Eigen;
373 using namespace std;
374 return igl::winding_number(V,cap,p);
375}
Definition LDLT.h:16

References igl::winding_number().

Referenced by igl::WindingNumberTree< Point, DerivedV, DerivedF >::cached_winding_number().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Member Data Documentation

◆ cached

template<typename Point , typename DerivedV , typename DerivedF >
std::map< std::pair< const igl::WindingNumberTree< Point, DerivedV, DerivedF > *, const igl::WindingNumberTree< Point, DerivedV, DerivedF > * >, typename DerivedV::Scalar > igl::WindingNumberTree< Point, DerivedV, DerivedF >::cached
static

◆ cap

template<typename Point , typename DerivedV , typename DerivedF >
MatrixXF igl::WindingNumberTree< Point, DerivedV, DerivedF >::cap
protected

◆ center

template<typename Point , typename DerivedV , typename DerivedF >
Point igl::WindingNumberTree< Point, DerivedV, DerivedF >::center
protected

◆ children

template<typename Point , typename DerivedV , typename DerivedF >
std::list<WindingNumberTree * > igl::WindingNumberTree< Point, DerivedV, DerivedF >::children
protected

◆ dummyV

template<typename Point , typename DerivedV , typename DerivedF >
DerivedV igl::WindingNumberTree< Point, DerivedV, DerivedF >::dummyV
static

◆ F

template<typename Point , typename DerivedV , typename DerivedF >
MatrixXF igl::WindingNumberTree< Point, DerivedV, DerivedF >::F
protected

◆ method

template<typename Point , typename DerivedV , typename DerivedF >
WindingNumberMethod igl::WindingNumberTree< Point, DerivedV, DerivedF >::method
protected

◆ parent

template<typename Point , typename DerivedV , typename DerivedF >
const WindingNumberTree* igl::WindingNumberTree< Point, DerivedV, DerivedF >::parent
protected

◆ radius

template<typename Point , typename DerivedV , typename DerivedF >
DerivedV::Scalar igl::WindingNumberTree< Point, DerivedV, DerivedF >::radius
protected

◆ SV

template<typename Point , typename DerivedV , typename DerivedF >
MatrixXS igl::WindingNumberTree< Point, DerivedV, DerivedF >::SV
protected

◆ V

template<typename Point , typename DerivedV , typename DerivedF >
DerivedV& igl::WindingNumberTree< Point, DerivedV, DerivedF >::V
protected

The documentation for this class was generated from the following file: