Эх сурвалжийг харах

Walking along seams.

Former-commit-id: 2e4a5b898dc5a42fce5d2131d1a6a053ab1d9a25
wkevin 9 жил өмнө
parent
commit
186f741087

+ 92 - 0
include/igl/comiso/miq.cpp

@@ -481,6 +481,98 @@ IGL_INLINE void igl::comiso::VertexIndexing<DerivedV, DerivedF>::InitFaceInteger
 template <typename DerivedV, typename DerivedF>
 IGL_INLINE void igl::comiso::VertexIndexing<DerivedV, DerivedF>::InitSeamInfo()
 {
+
+  std::vector<std::vector<int> >lEdgeSeamInfo; //tmp
+
+  // for every vertex, keep track of their adjacent vertices on seams.
+  std::vector<std::list<int> > VVSeam(V.rows());
+  Eigen::MatrixXi EV, FE, EF;
+  igl::edge_topology(V, F, EV, FE, EF);
+  for (unsigned int e=0;e<EF.rows();e++)
+  {
+      int f0 = EF(e,0);
+      int f1 = EF(e,1);
+      if (f1 == -1)
+        continue;
+
+      int k=0;
+      while(k<3)
+      {
+        if(FE(f0,k) == e)
+          break;
+        k++;
+      }
+      bool seam = Handle_Seams(f0,k);
+      if (seam)
+      {
+        int v0 = F(f0, k);
+        int v1 = F(f0, (k+1)%3);
+        VVSeam[v0].push_back(v1);
+        VVSeam[v1].push_back(v0);
+      }
+  }
+
+  // Find start vertices
+  std::vector<int> startVertices;
+  std::vector<bool> isStartVertex(V.rows());
+  for (unsigned int i=0;i<V.rows();i++)
+  {
+    isStartVertex[i] = false;
+    if (VVSeam[i].size() > 0 && VVSeam[i].size() != 2)
+    {
+      startVertices.push_back(i);
+      isStartVertex[i] = true;
+    }
+  }
+
+  for (unsigned int i=0;i<startVertices.size();i++)
+  {
+    auto startVertex = &VVSeam[startVertices[i]];
+    for (unsigned int j=0;j<startVertex->size();j++)
+    {
+      auto currentVertex = startVertex;
+      int currentVertexIndex = startVertices[i];
+
+      std::vector<int> thisSeam;
+      thisSeam.push_back(currentVertexIndex);
+
+      // walk along the seam
+      int nextVertexIndex = currentVertex->front();
+      currentVertex->pop_front();
+      int prevVertexIndex;
+      while (true)
+      {
+        // update indices (move to the next vertex)
+        prevVertexIndex = currentVertexIndex;
+        currentVertexIndex = nextVertexIndex;
+        currentVertex = &VVSeam[nextVertexIndex];
+
+        // add current vertex to this seam
+        thisSeam.push_back(currentVertexIndex);
+
+        // remove the previous vertex
+        auto it = std::find(currentVertex->begin(), currentVertex->end(), prevVertexIndex);
+        currentVertex->erase(it);
+
+        if (currentVertex->size() == 1 && !isStartVertex[currentVertexIndex])
+        {
+          nextVertexIndex = currentVertex->front();
+          currentVertex->pop_front();
+        }
+        else
+          break;
+      }
+      lEdgeSeamInfo.push_back(thisSeam);
+    }
+  }
+
+  for(auto elem : lEdgeSeamInfo){
+	  for(auto elem2 : elem){
+		  std::cout << elem2 << "\t";
+	  }
+	std::cout << std::endl;
+  }
+
   Handle_SystemInfo.EdgeSeamInfo.clear();
   std::set<int> hasConstraint;
   int integerVar = 0;