Przeglądaj źródła

Avoid repeated work + double check exact results.

Former-commit-id: bd65a3d7a8c44850aa67da4d913906ac1a4a61af
Qingnan Zhou 9 lat temu
rodzic
commit
8b3ba3ca34

+ 25 - 0
include/igl/copyleft/boolean/mesh_boolean.cpp

@@ -22,6 +22,7 @@
 #include <algorithm>
 
 //#define MESH_BOOLEAN_TIMING
+//#define DOUBLE_CHECK_EXACT_OUTPUT
 
 template <
   typename DerivedVA,
@@ -183,6 +184,30 @@ IGL_INLINE void igl::copyleft::boolean::mesh_boolean(
     igl::resolve_duplicated_faces(kept_faces, G, JJ);
     igl::slice(kept_face_indices, JJ, 1, J);
 
+#ifdef DOUBLE_CHECK_EXACT_OUTPUT
+    {
+      // Sanity check on exact output.
+      igl::copyleft::cgal::RemeshSelfIntersectionsParam params;
+      params.detect_only = true;
+      params.first_only = true;
+      MatrixXES dummy_VV;
+      DerivedFC dummy_FF, dummy_IF;
+      Eigen::VectorXi dummy_J, dummy_IM;
+      igl::copyleft::cgal::SelfIntersectMesh<
+        Kernel,
+        MatrixXES, DerivedFC,
+        MatrixXES, DerivedFC,
+        DerivedFC,
+        Eigen::VectorXi,
+        Eigen::VectorXi
+      > checker(V, G, params,
+          dummy_VV, dummy_FF, dummy_IF, dummy_J, dummy_IM);
+      if (checker.count != 0) {
+        throw "Self-intersection not fully resolved.";
+      }
+    }
+#endif
+
     MatrixX3S Vs(V.rows(), V.cols());
     for (size_t i=0; i<(size_t)V.rows(); i++)
     {

+ 4 - 0
include/igl/copyleft/cgal/extract_cells.cpp

@@ -395,12 +395,16 @@ IGL_INLINE size_t igl::copyleft::cgal::extract_cells_single_component(
   std::vector<size_t> cell_labels(num_patches * 2);
   for (size_t i=0; i<num_patches; i++) cell_labels[i] = i;
   std::vector<std::set<size_t> > equivalent_cells(num_patches*2);
+  std::vector<bool> processed(num_unique_edges, false);
 
   size_t label_count=0;
   for (size_t i=0; i<num_patches; i++) {
     for (const auto& entry : patch_adj[i]) {
       const size_t neighbor_patch = entry.first;
       const size_t uei = entry.second;
+      if (processed[uei]) continue;
+      processed[uei] = true;
+
       const auto& adj_faces = uE2E[uei];
       const size_t num_adj_faces = adj_faces.size();
       assert(num_adj_faces > 2);