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

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

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

Public Types

enum  SplitMethod { CENTER_ON_LONGEST_AXIS = 0 , MEDIAN_ON_LONGEST_AXIS = 1 , NUM_SPLIT_METHODS = 2 }
 

Public Member Functions

 WindingNumberAABB ()
 
 WindingNumberAABB (const Eigen::MatrixBase< DerivedV > &V, const Eigen::MatrixBase< DerivedF > &F)
 
 WindingNumberAABB (const WindingNumberTree< Point, DerivedV, DerivedF > &parent, const Eigen::MatrixBase< DerivedF > &F)
 
void set_mesh (const Eigen::MatrixBase< DerivedV > &V, const Eigen::MatrixBase< DerivedF > &F)
 
void init ()
 
bool inside (const Point &p) const
 
virtual void grow ()
 
void compute_min_max_corners ()
 
DerivedV::Scalar max_abs_winding_number (const Point &p) const
 
DerivedV::Scalar max_simple_abs_winding_number (const Point &p) const
 
void delete_children ()
 
void set_method (const WindingNumberMethod &m)
 
const DerivedV & getV () const
 
const MatrixXFgetF () const
 
const MatrixXFgetcap () 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 cached_winding_number (const WindingNumberTree &that, const Point &p) const
 

Public Attributes

enum igl::WindingNumberAABB::SplitMethod split_method
 

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

Point min_corner
 
Point max_corner
 
DerivedV::Scalar total_positive_area
 
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::WindingNumberAABB< 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
protectedinherited

◆ MatrixXS

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

Member Enumeration Documentation

◆ SplitMethod

template<typename Point , typename DerivedV , typename DerivedF >
enum igl::WindingNumberAABB::SplitMethod
Enumerator
CENTER_ON_LONGEST_AXIS 
MEDIAN_ON_LONGEST_AXIS 
NUM_SPLIT_METHODS 
31 {
@ CENTER_ON_LONGEST_AXIS
Definition WindingNumberAABB.h:32
@ MEDIAN_ON_LONGEST_AXIS
Definition WindingNumberAABB.h:33
@ NUM_SPLIT_METHODS
Definition WindingNumberAABB.h:34
enum igl::WindingNumberAABB::SplitMethod split_method

Constructor & Destructor Documentation

◆ WindingNumberAABB() [1/3]

template<typename Point , typename DerivedV , typename DerivedF >
igl::WindingNumberAABB< Point, DerivedV, DerivedF >::WindingNumberAABB ( )
inline
37 :
38 total_positive_area(std::numeric_limits<typename DerivedV::Scalar>::infinity()),
40 {}
DerivedV::Scalar total_positive_area
Definition WindingNumberAABB.h:28

◆ WindingNumberAABB() [2/3]

template<typename Point , typename DerivedV , typename DerivedF >
igl::WindingNumberAABB< Point, DerivedV, DerivedF >::WindingNumberAABB ( const Eigen::MatrixBase< DerivedV > &  V,
const Eigen::MatrixBase< DerivedF > &  F 
)
inline
104 :
105 WindingNumberTree<Point,DerivedV,DerivedF>(V,F),
106 min_corner(),
107 max_corner(),
109 std::numeric_limits<typename DerivedV::Scalar>::infinity()),
111{
112 init();
113}
Point min_corner
Definition WindingNumberAABB.h:26
Point max_corner
Definition WindingNumberAABB.h:27
void init()
Definition WindingNumberAABB.h:90
DerivedV & V
Definition WindingNumberTree.h:50
MatrixXF F
Definition WindingNumberTree.h:54

References igl::WindingNumberAABB< Point, DerivedV, DerivedF >::init().

+ Here is the call graph for this function:

◆ WindingNumberAABB() [3/3]

template<typename Point , typename DerivedV , typename DerivedF >
igl::WindingNumberAABB< Point, DerivedV, DerivedF >::WindingNumberAABB ( const WindingNumberTree< Point, DerivedV, DerivedF > &  parent,
const Eigen::MatrixBase< DerivedF > &  F 
)
inline
118 :
119 WindingNumberTree<Point,DerivedV,DerivedF>(parent,F),
120 min_corner(),
121 max_corner(),
123 std::numeric_limits<typename DerivedV::Scalar>::infinity()),
125{
126 init();
127}
const WindingNumberTree * parent
Definition WindingNumberTree.h:39

References igl::WindingNumberAABB< Point, DerivedV, DerivedF >::init().

+ Here is the call graph for this function:

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
inlinevirtualinherited
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
DerivedV::Scalar radius
Definition WindingNumberTree.h:58
static std::map< std::pair< const WindingNumberTree *, const WindingNumberTree * >, typename DerivedV::Scalar > cached
Definition WindingNumberTree.h:33
Point center
Definition WindingNumberTree.h:60
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:

◆ compute_min_max_corners()

template<typename Point , typename DerivedV , typename DerivedF >
void igl::WindingNumberAABB< Point, DerivedV, DerivedF >::compute_min_max_corners
inline
255{
256 using namespace std;
257 // initialize corners
258 for(int d = 0;d<min_corner.size();d++)
259 {
260 min_corner[d] = numeric_limits<typename Point::Scalar>::infinity();
261 max_corner[d] = -numeric_limits<typename Point::Scalar>::infinity();
262 }
263
264 this->center = Point(0,0,0);
265 // Loop over facets
266 for(int i = 0;i<this->getF().rows();i++)
267 {
268 for(int j = 0;j<this->getF().cols();j++)
269 {
270 for(int d = 0;d<min_corner.size();d++)
271 {
272 min_corner[d] =
273 this->getV()(this->getF()(i,j),d) < min_corner[d] ?
274 this->getV()(this->getF()(i,j),d) : min_corner[d];
275 max_corner[d] =
276 this->getV()(this->getF()(i,j),d) > max_corner[d] ?
277 this->getV()(this->getF()(i,j),d) : max_corner[d];
278 }
279 // This is biased toward vertices incident on more than one face, but
280 // perhaps that's good
281 this->center += this->getV().row(this->getF()(i,j));
282 }
283 }
284 // Average
285 this->center.array() /= this->getF().size();
286
287 //cout<<"min_corner: "<<this->min_corner.transpose()<<endl;
288 //cout<<"Center: "<<this->center.transpose()<<endl;
289 //cout<<"max_corner: "<<this->max_corner.transpose()<<endl;
290 //cout<<"Diag center: "<<((this->max_corner + this->min_corner)*0.5).transpose()<<endl;
291 //cout<<endl;
292
293 this->radius = (max_corner-min_corner).norm()/2.0;
294}
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index cols() const
Definition PlainObjectBase.h:153
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rows() const
Definition PlainObjectBase.h:151
const MatrixXF & getF() const
Definition WindingNumberTree.h:258
const DerivedV & getV() const
Definition WindingNumberTree.h:251
Kernel::Point_2 Point
Definition point_areas.cpp:20

◆ delete_children()

template<typename Point , typename DerivedV , typename DerivedF >
void igl::WindingNumberTree< Point, DerivedV, DerivedF >::delete_children
inlineinherited
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
inlineinherited
266{
267 return cap;
268}
MatrixXF cap
Definition WindingNumberTree.h:56

◆ getF()

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

◆ getV()

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

◆ grow()

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

Reimplemented from igl::WindingNumberTree< Point, DerivedV, DerivedF >.

131{
132 using namespace std;
133 using namespace Eigen;
134 // Clear anything that already exists
135 this->delete_children();
136
137 //cout<<"cap.rows(): "<<this->getcap().rows()<<endl;
138 //cout<<"F.rows(): "<<this->getF().rows()<<endl;
139
140 // Base cases
141 if(
142 this->getF().rows() <= (WindingNumberAABB_MIN_F>0?WindingNumberAABB_MIN_F:0) ||
143 (this->getcap().rows() - 2) >= this->getF().rows())
144 {
145 // Don't grow
146 return;
147 }
148
149 // Compute longest direction
150 int max_d = -1;
151 typename DerivedV::Scalar max_len =
152 -numeric_limits<typename DerivedV::Scalar>::infinity();
153 for(int d = 0;d<min_corner.size();d++)
154 {
155 if( (max_corner[d] - min_corner[d]) > max_len )
156 {
157 max_len = (max_corner[d] - min_corner[d]);
158 max_d = d;
159 }
160 }
161 // Compute facet barycenters
163 barycenter(this->getV(),this->getF(),BC);
164
165
166 // Blerg, why is selecting rows so difficult
167
168 typename DerivedV::Scalar split_value;
169 // Split in longest direction
170 switch(split_method)
171 {
173 // Determine median
174 median(BC.col(max_d),split_value);
175 break;
176 default:
177 assert(false);
179 split_value = 0.5*(max_corner[max_d] + min_corner[max_d]);
180 break;
181 }
182 //cout<<"c: "<<0.5*(max_corner[max_d] + min_corner[max_d])<<" "<<
183 // "m: "<<split_value<<endl;;
184
185 vector<int> id( this->getF().rows());
186 for(int i = 0;i<this->getF().rows();i++)
187 {
188 if(BC(i,max_d) <= split_value)
189 {
190 id[i] = 0; //left
191 }else
192 {
193 id[i] = 1; //right
194 }
195 }
196
197 const int lefts = (int) count(id.begin(),id.end(),0);
198 const int rights = (int) count(id.begin(),id.end(),1);
199 if(lefts == 0 || rights == 0)
200 {
201 // badly balanced base case (could try to recut)
202 return;
203 }
204 assert(lefts+rights == this->getF().rows());
205 DerivedF leftF(lefts, this->getF().cols());
206 DerivedF rightF(rights,this->getF().cols());
207 int left_i = 0;
208 int right_i = 0;
209 for(int i = 0;i<this->getF().rows();i++)
210 {
211 if(id[i] == 0)
212 {
213 leftF.row(left_i++) = this->getF().row(i);
214 }else if(id[i] == 1)
215 {
216 rightF.row(right_i++) = this->getF().row(i);
217 }else
218 {
219 assert(false);
220 }
221 }
222 assert(right_i == rightF.rows());
223 assert(left_i == leftF.rows());
224 // Finally actually grow children and Recursively grow
225 WindingNumberAABB<Point,DerivedV,DerivedF> * leftWindingNumberAABB =
226 new WindingNumberAABB<Point,DerivedV,DerivedF>(*this,leftF);
227 leftWindingNumberAABB->grow();
228 this->children.push_back(leftWindingNumberAABB);
229 WindingNumberAABB<Point,DerivedV,DerivedF> * rightWindingNumberAABB =
230 new WindingNumberAABB<Point,DerivedV,DerivedF>(*this,rightF);
231 rightWindingNumberAABB->grow();
232 this->children.push_back(rightWindingNumberAABB);
233}
The matrix class, also used for vectors and row-vectors.
Definition Matrix.h:180
const MatrixXF & getcap() const
Definition WindingNumberTree.h:265
void delete_children()
Definition WindingNumberTree.h:226
Definition LDLT.h:16
IGL_INLINE void count(const Eigen::SparseMatrix< XType > &X, const int dim, Eigen::SparseVector< SType > &S)
Definition count.cpp:12
IGL_INLINE bool median(const Eigen::MatrixBase< DerivedV > &V, mType &m)
Definition median.cpp:15
IGL_INLINE void barycenter(const Eigen::MatrixBase< DerivedV > &V, const Eigen::MatrixBase< DerivedF > &F, Eigen::PlainObjectBase< DerivedBC > &BC)
Definition barycenter.cpp:14
S::iterator begin(S &sh, const PathTag &)
Definition geometry_traits.hpp:614
size_t cols(const T &raster)
Definition MarchingSquares.hpp:60
size_t rows(const T &raster)
Definition MarchingSquares.hpp:55

References igl::barycenter(), igl::count(), igl::WindingNumberAABB< Point, DerivedV, DerivedF >::grow(), and igl::median().

Referenced by igl::WindingNumberAABB< Point, DerivedV, DerivedF >::grow(), igl::signed_distance(), and igl::copyleft::cgal::signed_distance_isosurface().

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

◆ init()

template<typename Point , typename DerivedV , typename DerivedF >
void igl::WindingNumberAABB< Point, DerivedV, DerivedF >::init
inline
91{
92 using namespace Eigen;
93 assert(max_corner.size() == 3);
94 assert(min_corner.size() == 3);
97 doublearea(this->getV(),this->getF(),dblA);
98 total_positive_area = dblA.sum()/2.0;
99}
void compute_min_max_corners()
Definition WindingNumberAABB.h:254
IGL_INLINE void doublearea(const Eigen::MatrixBase< DerivedV > &V, const Eigen::MatrixBase< DerivedF > &F, Eigen::PlainObjectBase< DeriveddblA > &dblA)
Definition doublearea.cpp:17

References igl::doublearea().

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

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

◆ inside()

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

Reimplemented from igl::WindingNumberTree< Point, DerivedV, DerivedF >.

237{
238 assert(p.size() == max_corner.size());
239 assert(p.size() == min_corner.size());
240 for(int i = 0;i<p.size();i++)
241 {
243 //if( p(i) < min_corner(i) || p(i) >= max_corner(i))
244 // **MUST** be conservative
245 if( p(i) < min_corner(i) || p(i) > max_corner(i))
246 {
247 return false;
248 }
249 }
250 return true;
251}

◆ max_abs_winding_number()

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

Reimplemented from igl::WindingNumberTree< Point, DerivedV, DerivedF >.

299{
300 using namespace std;
301 // Only valid if not inside
302 if(inside(p))
303 {
304 return numeric_limits<typename DerivedV::Scalar>::infinity();
305 }
306 // Q: we know the total positive area so what's the most this could project
307 // to? Remember it could be layered in the same direction.
308 return numeric_limits<typename DerivedV::Scalar>::infinity();
309}
bool inside(const Point &p) const
Definition WindingNumberAABB.h:236

◆ max_simple_abs_winding_number()

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

Reimplemented from igl::WindingNumberTree< Point, DerivedV, DerivedF >.

315{
316 using namespace std;
317 using namespace Eigen;
318 // Only valid if not inside
319 if(inside(p))
320 {
321 return numeric_limits<typename DerivedV::Scalar>::infinity();
322 }
323 // Max simple is the same as sum of positive winding number contributions of
324 // bounding box
325
326 // begin precomputation
327 //MatrixXd BV((int)pow(2,3),3);
328 typedef
330 MatrixXS;
331 typedef
333 MatrixXF;
334 MatrixXS BV((int)(1<<3),3);
335 BV <<
344 MatrixXF BF(2*2*3,3);
345 BF <<
346 0,6,4,
347 0,2,6,
348 0,3,2,
349 0,1,3,
350 2,7,6,
351 2,3,7,
352 4,6,7,
353 4,7,5,
354 0,4,5,
355 0,5,1,
356 1,5,7,
357 1,7,3;
358 MatrixXS BFN;
359 per_face_normals(BV,BF,BFN);
360 // end of precomputation
361
362 // Only keep those with positive dot products
363 MatrixXF PBF(BF.rows(),BF.cols());
364 int pbfi = 0;
365 Point p2c = 0.5*(min_corner+max_corner)-p;
366 for(int i = 0;i<BFN.rows();i++)
367 {
368 if(p2c.dot(BFN.row(i)) > 0)
369 {
370 PBF.row(pbfi++) = BF.row(i);
371 }
372 }
373 PBF.conservativeResize(pbfi,PBF.cols());
374 return igl::winding_number(BV,PBF,p);
375}
Eigen::Matrix< typename DerivedF::Scalar, Eigen::Dynamic, Eigen::Dynamic > MatrixXF
Definition WindingNumberTree.h:46
Eigen::Matrix< typename DerivedV::Scalar, Eigen::Dynamic, Eigen::Dynamic > MatrixXS
Definition WindingNumberTree.h:43
IGL_INLINE void per_face_normals(const Eigen::MatrixBase< DerivedV > &V, const Eigen::MatrixBase< DerivedF > &F, const Eigen::MatrixBase< DerivedZ > &Z, Eigen::PlainObjectBase< DerivedN > &N)
Definition per_face_normals.cpp:13
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 Eigen::PlainObjectBase< Derived >::cols(), Eigen::PlainObjectBase< Derived >::conservativeResize(), igl::per_face_normals(), Eigen::PlainObjectBase< Derived >::rows(), and igl::winding_number().

+ Here is the call graph for this function:

◆ print()

template<typename Point , typename DerivedV , typename DerivedF >
void igl::WindingNumberTree< Point, DerivedV, DerivedF >::print ( const char *  tab = "")
inlineinherited
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::WindingNumberAABB< Point, DerivedV, DerivedF >::set_mesh ( const Eigen::MatrixBase< DerivedV > &  V,
const Eigen::MatrixBase< DerivedF > &  F 
)
inlinevirtual

Reimplemented from igl::WindingNumberTree< Point, DerivedV, DerivedF >.

84{
86 init();
87}
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().

Referenced by igl::signed_distance(), and igl::copyleft::cgal::signed_distance_isosurface().

+ 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)
inlineinherited
242{
243 this->method = m;
244 for(auto child : children)
245 {
246 child->set_method(m);
247 }
248}
WindingNumberMethod method
Definition WindingNumberTree.h:38

◆ winding_number()

template<typename Point , typename DerivedV , typename DerivedF >
DerivedV::Scalar igl::WindingNumberTree< Point, DerivedV, DerivedF >::winding_number ( const Point p) const
inlineinherited
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}
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
@ EXACT_WINDING_NUMBER_METHOD
Definition WindingNumberMethod.h:17
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
inlineinherited
364{
365 return igl::winding_number(V,F,p);
366}

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
inlineinherited
371{
372 using namespace Eigen;
373 using namespace std;
374 return igl::winding_number(V,cap,p);
375}

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
staticinherited

◆ cap

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

◆ center

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

◆ children

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

◆ dummyV

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

◆ F

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

◆ max_corner

template<typename Point , typename DerivedV , typename DerivedF >
Point igl::WindingNumberAABB< Point, DerivedV, DerivedF >::max_corner
protected

◆ method

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

◆ min_corner

template<typename Point , typename DerivedV , typename DerivedF >
Point igl::WindingNumberAABB< Point, DerivedV, DerivedF >::min_corner
protected

◆ parent

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

◆ radius

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

◆ split_method

template<typename Point , typename DerivedV , typename DerivedF >
enum igl::WindingNumberAABB::SplitMethod igl::WindingNumberAABB< Point, DerivedV, DerivedF >::split_method

◆ SV

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

◆ total_positive_area

template<typename Point , typename DerivedV , typename DerivedF >
DerivedV::Scalar igl::WindingNumberAABB< Point, DerivedV, DerivedF >::total_positive_area
protected

◆ V

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

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