Просмотр исходного кода

Merge branch 'master' of github.com:libigl/libigl into alecjacobson

Former-commit-id: a1c901cf85137acb7edc79c10100cefce0cc7e7d
Alec Jacobson 8 лет назад
Родитель
Сommit
35efa65078

+ 1 - 1
include/igl/angle_bound_frame_fields.cpp

@@ -154,7 +154,7 @@ precomputeInteriorEdges()
   // Flag border edges
   numInteriorEdges = 0;
   isBorderEdge.setZero(numE,1);
-  indFullToInterior = -1.*Eigen::VectorXi::Ones(numE,1);
+  indFullToInterior = Eigen::VectorXi::Constant(numE,-1);
 
   for(unsigned i=0; i<numE; ++i)
   {

+ 8 - 10
include/igl/readOBJ.cpp

@@ -14,6 +14,8 @@
 #include <iostream>
 #include <cstdio>
 #include <fstream>
+#include <sstream>
+#include <iterator>
 
 template <typename Scalar, typename Index>
 IGL_INLINE bool igl::readOBJ(
@@ -77,22 +79,18 @@ IGL_INLINE bool igl::readOBJ(
       char * l = &line[strlen(type)];
       if(type == v)
       {
-        double x[4];
-        int count =
-        sscanf(l,"%lf %lf %lf %lf\n",&x[0],&x[1],&x[2],&x[3]);
-        if(count != 3 && count != 4)
+        std::istringstream ls(&line[1]);
+        std::vector<Scalar > vertex{ std::istream_iterator<Scalar >(ls), std::istream_iterator<Scalar >() };
+
+        if (vertex.size() < 3)
         {
           fprintf(stderr,
-                  "Error: readOBJ() vertex on line %d should have 3 or 4 coordinates",
+                  "Error: readOBJ() vertex on line %d should have at least 3 coordinates",
                   line_no);
           fclose(obj_file);
           return false;
         }
-        std::vector<Scalar > vertex(count);
-        for(int i = 0;i<count;i++)
-        {
-          vertex[i] = x[i];
-        }
+      
         V.push_back(vertex);
       }else if(type == vn)
       {

+ 2 - 2
include/igl/triangle/triangulate.cpp

@@ -109,8 +109,8 @@ IGL_INLINE void igl::triangle::triangulate(
   }
 
   in.numberofpointattributes = 0;
-  in.pointmarkerlist = (int*)calloc(VM.size(),sizeof(int));
-  for(unsigned i=0;i<VM.rows();++i) in.pointmarkerlist[i] = VM.size()?VM(i):1;
+  in.pointmarkerlist = (int*)calloc(V.size(),sizeof(int)) ;
+  for(unsigned i=0;i<V.rows();++i) in.pointmarkerlist[i] = VM.size()?VM(i):1;
 
   in.trianglelist = NULL;
   in.numberoftriangles = 0;

+ 14 - 16
include/igl/vector_area_matrix.cpp

@@ -26,28 +26,26 @@ IGL_INLINE void igl::vector_area_matrix(
   // number of vertices
   const int n = F.maxCoeff()+1;
 
-	SparseMatrix<Scalar> aux (n * 2, n * 2);
-	SparseMatrix<Scalar> auxT(n * 2, n * 2);
-
-	vector<Triplet<Scalar> > auxTripletList;
-	vector<Triplet<Scalar> > auxTTripletList;
-
   MatrixXi E;
   boundary_facets(F,E);
 
-	for(int k = 0; k < E.rows(); k++)
+  //Prepare a vector of triplets to set the matrix
+  vector<Triplet<Scalar> > tripletList;
+  tripletList.reserve(4*E.rows());
+
+  for(int k = 0; k < E.rows(); k++)
   {
 		int i = E(k,0);
 		int j = E(k,1);
-		auxTripletList.push_back(Triplet<Scalar>(i+n, j, -0.5));
-		auxTripletList.push_back(Triplet<Scalar>(i, j+n, 0.5));
-		auxTTripletList.push_back(Triplet<Scalar>(j, i+n, -0.5));
-		auxTTripletList.push_back(Triplet<Scalar>(j+n, i, 0.5));
-	}
-
-	aux.setFromTriplets(auxTripletList.begin(), auxTripletList.end());
-	auxT.setFromTriplets(auxTTripletList.begin(), auxTTripletList.end());
-	A = (aux + auxT)*0.5;
+        tripletList.push_back(Triplet<Scalar>(i+n, j, -0.25));
+        tripletList.push_back(Triplet<Scalar>(j, i+n, -0.25));
+        tripletList.push_back(Triplet<Scalar>(i, j+n, 0.25));
+        tripletList.push_back(Triplet<Scalar>(j+n, i, 0.25));
+  }
+
+  //Set A from triplets (Eigen will sum triplets with same coordinates)
+  A.resize(n * 2, n * 2);
+  A.setFromTriplets(tripletList.begin(), tripletList.end());
 }
 
 #ifdef IGL_STATIC_LIBRARY