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

templates and a small update to polyvector_field_singularities_from_matchings (since one-ring tracing is now done with a slightly different prototype)

Former-commit-id: 07bea1d1d04d8a0d269a69cda26fdd2f1ce41d44
Olga Diamanti 9 лет назад
Родитель
Сommit
701da3ed59

+ 1 - 0
include/igl/colon.cpp

@@ -53,6 +53,7 @@ template void igl::colon<int, int, int>(int, int, Eigen::Matrix<int, -1, 1, 0, -
 template void igl::colon<int,long long int,int>(int,long long int,Eigen::Matrix<int,-1,1,0,-1,1> &);
 template void igl::colon<int,long long int,int>(int,long long int,Eigen::Matrix<int,-1,1,0,-1,1> &);
 template void igl::colon<int, int, int, int>(int, int, int, Eigen::Matrix<int, -1, 1, 0, -1, 1>&);
 template void igl::colon<int, int, int, int>(int, int, int, Eigen::Matrix<int, -1, 1, 0, -1, 1>&);
 template void igl::colon<int, long, long>(int, long, Eigen::Matrix<long, -1, 1, 0, -1, 1>&);
 template void igl::colon<int, long, long>(int, long, Eigen::Matrix<long, -1, 1, 0, -1, 1>&);
+template void igl::colon<int, double, double, double>(int, double, double, Eigen::Matrix<double, -1, 1, 0, -1, 1>&);
 #ifdef WIN32
 #ifdef WIN32
 template void igl::colon<int, long long,long>(int, long long, class Eigen::Matrix<long,-1,1,0,-1,1> &);
 template void igl::colon<int, long long,long>(int, long long, class Eigen::Matrix<long,-1,1,0,-1,1> &);
 #endif
 #endif

+ 1 - 0
include/igl/matlab_format.cpp

@@ -128,4 +128,5 @@ template Eigen::WithFormat<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const igl::m
 template Eigen::WithFormat<Eigen::Matrix<double, 2, 3, 0, 2, 3> > const igl::matlab_format<Eigen::Matrix<double, 2, 3, 0, 2, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 3, 0, 2, 3> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);
 template Eigen::WithFormat<Eigen::Matrix<double, 2, 3, 0, 2, 3> > const igl::matlab_format<Eigen::Matrix<double, 2, 3, 0, 2, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 3, 0, 2, 3> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);
 template Eigen::WithFormat<Eigen::Matrix<double, 3, 2, 0, 3, 2> > const igl::matlab_format<Eigen::Matrix<double, 3, 2, 0, 3, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 2, 0, 3, 2> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);
 template Eigen::WithFormat<Eigen::Matrix<double, 3, 2, 0, 3, 2> > const igl::matlab_format<Eigen::Matrix<double, 3, 2, 0, 3, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 2, 0, 3, 2> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);
 template Eigen::WithFormat<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const igl::matlab_format<Eigen::Matrix<float, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);
 template Eigen::WithFormat<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const igl::matlab_format<Eigen::Matrix<float, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);
+template Eigen::WithFormat<Eigen::Matrix<int, 2, 2, 0, 2, 2> > const igl::matlab_format<Eigen::Matrix<int, 2, 2, 0, 2, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<int, 2, 2, 0, 2, 2> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);
 #endif
 #endif

+ 29 - 25
include/igl/polyvector_field_singularities_from_matchings.cpp

@@ -26,7 +26,7 @@ void igl::polyvector_field_one_ring_matchings(const Eigen::PlainObjectBase<Deriv
   //first, check if the vertex is on a boundary
   //first, check if the vertex is on a boundary
   //then there must be two faces that are on the boundary
   //then there must be two faces that are on the boundary
   //(other cases not supported)
   //(other cases not supported)
-  
+
   int fstart = -1;
   int fstart = -1;
   int ind = 0;
   int ind = 0;
   for (int i =0; i<VF[vi].size(); ++i)
   for (int i =0; i<VF[vi].size(); ++i)
@@ -52,7 +52,7 @@ void igl::polyvector_field_one_ring_matchings(const Eigen::PlainObjectBase<Deriv
   fi[i] = current_face;
   fi[i] = current_face;
   for (int j=0; j<half_degree; ++j)
   for (int j=0; j<half_degree; ++j)
     mvi(i,j) = j;
     mvi(i,j) = j;
-  
+
   int next_face = -1;
   int next_face = -1;
   while (next_face != fstart && current_face!=-1)
   while (next_face != fstart && current_face!=-1)
   {
   {
@@ -65,17 +65,17 @@ void igl::polyvector_field_one_ring_matchings(const Eigen::PlainObjectBase<Deriv
         break;
         break;
       }
       }
     assert(j!=-1);
     assert(j!=-1);
-    
+
     next_face = TT(current_face, j);
     next_face = TT(current_face, j);
     ++i;
     ++i;
-    
+
     if (next_face == -1)
     if (next_face == -1)
       mvi.row(i).setConstant(-1);
       mvi.row(i).setConstant(-1);
     else
     else
     {
     {
       // look at the edge between the two faces
       // look at the edge between the two faces
       const int &current_edge = F2E(current_face,j);
       const int &current_edge = F2E(current_face,j);
-      
+
       for (int k=0; k<half_degree; ++k)
       for (int k=0; k<half_degree; ++k)
       {
       {
         // check its orientation to determine whether match_ab or match_ba should be used
         // check its orientation to determine whether match_ab or match_ba should be used
@@ -109,17 +109,17 @@ IGL_INLINE void igl::polyvector_field_singularities_from_matchings(
                                                                    const Eigen::PlainObjectBase<DerivedM> &match_ba,
                                                                    const Eigen::PlainObjectBase<DerivedM> &match_ba,
                                                                    Eigen::PlainObjectBase<DerivedS> &singularities)
                                                                    Eigen::PlainObjectBase<DerivedS> &singularities)
 {
 {
-  
+
   std::vector<bool> V_border = igl::is_border_vertex(V,F);
   std::vector<bool> V_border = igl::is_border_vertex(V,F);
   std::vector<std::vector<int> > VF, VFi;
   std::vector<std::vector<int> > VF, VFi;
   igl::vertex_triangle_adjacency(V,F,VF,VFi);
   igl::vertex_triangle_adjacency(V,F,VF,VFi);
-  
+
   Eigen::MatrixXi TT, TTi;
   Eigen::MatrixXi TT, TTi;
   igl::triangle_triangle_adjacency(F,TT,TTi);
   igl::triangle_triangle_adjacency(F,TT,TTi);
-  
+
   Eigen::MatrixXi E, E2F, F2E;
   Eigen::MatrixXi E, E2F, F2E;
   igl::edge_topology(V,F,E,F2E,E2F);
   igl::edge_topology(V,F,E,F2E,E2F);
-  
+
   igl::polyvector_field_singularities_from_matchings(V, F, V_border, VF, TT, E2F, F2E, match_ab, match_ba, singularities);
   igl::polyvector_field_singularities_from_matchings(V, F, V_border, VF, TT, E2F, F2E, match_ab, match_ba, singularities);
 }
 }
 
 
@@ -136,9 +136,9 @@ IGL_INLINE void igl::polyvector_field_singularities_from_matchings(
                                                                    const Eigen::PlainObjectBase<DerivedM> &match_ba,
                                                                    const Eigen::PlainObjectBase<DerivedM> &match_ba,
                                                                    Eigen::PlainObjectBase<DerivedS> &singularities)
                                                                    Eigen::PlainObjectBase<DerivedS> &singularities)
 {
 {
-  
+
   int numV = V.rows();
   int numV = V.rows();
-  
+
   std::vector<int> singularities_v;
   std::vector<int> singularities_v;
   int half_degree = match_ab.cols();
   int half_degree = match_ab.cols();
   for (int vi =0; vi<numV; ++vi)
   for (int vi =0; vi<numV; ++vi)
@@ -149,7 +149,7 @@ IGL_INLINE void igl::polyvector_field_singularities_from_matchings(
     Eigen::VectorXi fi;
     Eigen::VectorXi fi;
     Eigen::MatrixXi mvi;
     Eigen::MatrixXi mvi;
     igl::polyvector_field_one_ring_matchings(V, F, VF, E2F, F2E, TT, match_ab, match_ba, vi, mvi, fi);
     igl::polyvector_field_one_ring_matchings(V, F, VF, E2F, F2E, TT, match_ab, match_ba, vi, mvi, fi);
-    
+
     int num = fi.size();
     int num = fi.size();
     //pick one of the vectors to check for singularities
     //pick one of the vectors to check for singularities
     for (int vector_to_match = 0; vector_to_match < half_degree; ++vector_to_match)
     for (int vector_to_match = 0; vector_to_match < half_degree; ++vector_to_match)
@@ -164,7 +164,7 @@ IGL_INLINE void igl::polyvector_field_singularities_from_matchings(
   std::sort(singularities_v.begin(), singularities_v.end());
   std::sort(singularities_v.begin(), singularities_v.end());
   auto last = std::unique(singularities_v.begin(), singularities_v.end());
   auto last = std::unique(singularities_v.begin(), singularities_v.end());
   singularities_v.erase(last, singularities_v.end());
   singularities_v.erase(last, singularities_v.end());
-  
+
   igl::list_to_matrix(singularities_v, singularities);
   igl::list_to_matrix(singularities_v, singularities);
 }
 }
 
 
@@ -178,17 +178,17 @@ IGL_INLINE void igl::polyvector_field_singularities_from_matchings(
                                                                    Eigen::PlainObjectBase<DerivedS> &singularities,
                                                                    Eigen::PlainObjectBase<DerivedS> &singularities,
                                                                    Eigen::PlainObjectBase<DerivedS> &singularity_indices)
                                                                    Eigen::PlainObjectBase<DerivedS> &singularity_indices)
 {
 {
-  
+
   std::vector<bool> V_border = igl::is_border_vertex(V,F);
   std::vector<bool> V_border = igl::is_border_vertex(V,F);
   std::vector<std::vector<int> > VF, VFi;
   std::vector<std::vector<int> > VF, VFi;
   igl::vertex_triangle_adjacency(V,F,VF,VFi);
   igl::vertex_triangle_adjacency(V,F,VF,VFi);
-  
+
   Eigen::MatrixXi TT, TTi;
   Eigen::MatrixXi TT, TTi;
   igl::triangle_triangle_adjacency(V,F,TT,TTi);
   igl::triangle_triangle_adjacency(V,F,TT,TTi);
-  
+
   Eigen::MatrixXi E, E2F, F2E;
   Eigen::MatrixXi E, E2F, F2E;
   igl::edge_topology(V,F,E,F2E,E2F);
   igl::edge_topology(V,F,E,F2E,E2F);
-  
+
   igl::polyvector_field_singularities_from_matchings(V, F, V_border, VF, TT, E2F, F2E, match_ab, match_ba, singularities, singularity_indices);
   igl::polyvector_field_singularities_from_matchings(V, F, V_border, VF, TT, E2F, F2E, match_ab, match_ba, singularities, singularity_indices);
 }
 }
 
 
@@ -207,24 +207,28 @@ IGL_INLINE void igl::polyvector_field_singularities_from_matchings(
                                                                    Eigen::PlainObjectBase<DerivedS> &singularity_indices)
                                                                    Eigen::PlainObjectBase<DerivedS> &singularity_indices)
 {
 {
   igl::polyvector_field_singularities_from_matchings(V, F, V_border, VF, TT, E2F, F2E, match_ab, match_ba, singularities);
   igl::polyvector_field_singularities_from_matchings(V, F, V_border, VF, TT, E2F, F2E, match_ab, match_ba, singularities);
-  
+
   singularity_indices.setZero(singularities.size(), 1);
   singularity_indices.setZero(singularities.size(), 1);
-  
+
   //get index from first vector only
   //get index from first vector only
   int vector_to_match = 0;
   int vector_to_match = 0;
   for (int i =0; i<singularities.size(); ++i)
   for (int i =0; i<singularities.size(); ++i)
   {
   {
     int vi = singularities[i];
     int vi = singularities[i];
-    
-    Eigen::VectorXi mvi,fi;
-    igl::polyvector_field_one_ring_matchings(V, F, VF, E2F, F2E, TT, match_ab, match_ba, vi, vector_to_match, mvi, fi);
-    
-    singularity_indices[i] = (mvi.tail(1)[0] - vector_to_match);
+
+    // Eigen::VectorXi mvi,fi;
+    // igl::polyvector_field_one_ring_matchings(V, F, VF, E2F, F2E, TT, match_ab, match_ba, vi, vector_to_match, mvi, fi);
+    Eigen::VectorXi fi;
+    Eigen::MatrixXi mvi;
+    igl::polyvector_field_one_ring_matchings(V, F, VF, E2F, F2E, TT, match_ab, match_ba, vi, mvi, fi);
+
+    singularity_indices[i] = (mvi(mvi.rows()-1,vector_to_match) - vector_to_match);
   }
   }
-  
+
 }
 }
 
 
 #ifdef IGL_STATIC_LIBRARY
 #ifdef IGL_STATIC_LIBRARY
 // Explicit template specialization
 // Explicit template specialization
 template void igl::polyvector_field_singularities_from_matchings<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
 template void igl::polyvector_field_singularities_from_matchings<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
+template void igl::polyvector_field_singularities_from_matchings<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, int, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::__1::vector<bool, std::__1::allocator<bool> > const&, std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
 #endif
 #endif

+ 3 - 0
include/igl/slice.cpp

@@ -274,4 +274,7 @@ template void igl::slice<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix
 template void igl::slice<Eigen::Matrix<float, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<float, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> >&);
 template void igl::slice<Eigen::Matrix<float, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<float, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> >&);
 template Eigen::Matrix<int, -1, -1, 0, -1, -1> igl::slice<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&);
 template Eigen::Matrix<int, -1, -1, 0, -1, -1> igl::slice<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&);
 template void igl::slice<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::Matrix<double, -1, 1, 0, -1, 1>&);
 template void igl::slice<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::Matrix<double, -1, 1, 0, -1, 1>&);
+template void igl::slice<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::Matrix<int, -1, -1, 0, -1, -1>&);
+template void igl::slice<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::Matrix<int, -1, 1, 0, -1, 1>&);
+
 #endif
 #endif