Selaa lähdekoodia

Added peel_winding_number_layers(...) method.

Former-commit-id: 19c6b62d21adc9ce180ed7b3d08e1d3f7446bda6
Qingnan Zhou 9 vuotta sitten
vanhempi
commit
181045fbda

+ 33 - 0
include/igl/cgal/peel_winding_number_layers.cpp

@@ -0,0 +1,33 @@
+#include "peel_winding_number_layers.h"
+
+#include <cassert>
+
+#include "propagate_winding_numbers.h"
+
+template<
+typename DerivedV,
+typename DerivedF,
+typename DerivedW >
+IGL_INLINE size_t igl::cgal::peel_winding_number_layers(
+        const Eigen::PlainObjectBase<DerivedV > & V,
+        const Eigen::PlainObjectBase<DerivedF > & F,
+        Eigen::PlainObjectBase<DerivedW>& W) {
+    const size_t num_faces = F.rows();
+    Eigen::VectorXi labels(num_faces);
+    labels.setZero();
+
+    Eigen::MatrixXi winding_numbers;
+    igl::cgal::propagate_winding_numbers(V, F, labels, winding_numbers);
+    assert(winding_numbers.rows() == num_faces);
+    assert(winding_numbers.cols() == 2);
+
+    int min_w = winding_numbers.minCoeff();
+    int max_w = winding_numbers.maxCoeff();
+    assert(max_w > min_w);
+
+    W.resize(num_faces, 1);
+    for (size_t i=0; i<num_faces; i++) {
+        W(i, 0) = winding_numbers(i, 1);
+    }
+    return max_w - min_w;
+}

+ 22 - 0
include/igl/cgal/peel_winding_number_layers.h

@@ -0,0 +1,22 @@
+#ifndef IGL_CGAL_PEEL_WINDING_NUMBER_LAYERS_H
+#define IGL_CGAL_PEEL_WINDING_NUMBER_LAYERS_H
+#include "../igl_inline.h"
+#include <Eigen/Core>
+
+namespace igl {
+    namespace cgal {
+        template<
+            typename DerivedV,
+            typename DerivedF,
+            typename DerivedW >
+        IGL_INLINE size_t peel_winding_number_layers(
+                const Eigen::PlainObjectBase<DerivedV > & V,
+                const Eigen::PlainObjectBase<DerivedF > & F,
+                Eigen::PlainObjectBase<DerivedW>& W);
+    }
+}
+
+#ifndef IGL_STATIC_LIBRARY
+#  include "peel_winding_number_layers.cpp"
+#endif
+#endif

+ 1 - 1
include/igl/cgal/propagate_winding_numbers.cpp

@@ -88,7 +88,7 @@ IGL_INLINE bool igl::cgal::propagate_winding_numbers_single_component_patch_wise
             if (f[0] == s && f[1] == d) return false;
             if (f[1] == s && f[2] == d) return false;
             if (f[2] == s && f[0] == d) return false;
-            throw "Edge does not belong to face.";
+            throw std::runtime_error("Edge does not belong to face.");
             return false;
         };