peel_winding_number_layers.cpp 961 B

123456789101112131415161718192021222324252627282930313233
  1. #include "peel_winding_number_layers.h"
  2. #include <cassert>
  3. #include "propagate_winding_numbers.h"
  4. template<
  5. typename DerivedV,
  6. typename DerivedF,
  7. typename DerivedW >
  8. IGL_INLINE size_t igl::copyleft::cgal::peel_winding_number_layers(
  9. const Eigen::PlainObjectBase<DerivedV > & V,
  10. const Eigen::PlainObjectBase<DerivedF > & F,
  11. Eigen::PlainObjectBase<DerivedW>& W) {
  12. const size_t num_faces = F.rows();
  13. Eigen::VectorXi labels(num_faces);
  14. labels.setZero();
  15. Eigen::MatrixXi winding_numbers;
  16. igl::copyleft::cgal::propagate_winding_numbers(V, F, labels, winding_numbers);
  17. assert(winding_numbers.rows() == num_faces);
  18. assert(winding_numbers.cols() == 2);
  19. int min_w = winding_numbers.minCoeff();
  20. int max_w = winding_numbers.maxCoeff();
  21. assert(max_w > min_w);
  22. W.resize(num_faces, 1);
  23. for (size_t i=0; i<num_faces; i++) {
  24. W(i, 0) = winding_numbers(i, 1);
  25. }
  26. return max_w - min_w;
  27. }