|
@@ -7,33 +7,33 @@
|
|
// obtain one at http://mozilla.org/MPL/2.0/.
|
|
// obtain one at http://mozilla.org/MPL/2.0/.
|
|
#include "removeUnreferenced.h"
|
|
#include "removeUnreferenced.h"
|
|
|
|
|
|
-template <typename T, typename S>
|
|
|
|
|
|
+template <typename Scalar, typename Index>
|
|
IGL_INLINE void igl::removeUnreferenced(
|
|
IGL_INLINE void igl::removeUnreferenced(
|
|
- const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &V,
|
|
|
|
- const Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic> &F,
|
|
|
|
- Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &NV,
|
|
|
|
- Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic> &NF,
|
|
|
|
- Eigen::Matrix<S, Eigen::Dynamic, 1> &I)
|
|
|
|
|
|
+ const Eigen::PlainObjectBase<Scalar> &V,
|
|
|
|
+ const Eigen::PlainObjectBase<Index> &F,
|
|
|
|
+ Eigen::PlainObjectBase<Scalar> &NV,
|
|
|
|
+ Eigen::PlainObjectBase<Index> &NF,
|
|
|
|
+ Eigen::PlainObjectBase<Index> &I
|
|
|
|
+ )
|
|
{
|
|
{
|
|
|
|
|
|
// Mark referenced vertices
|
|
// Mark referenced vertices
|
|
- Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic> mark = Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic>::Zero(V.rows(),1);
|
|
|
|
|
|
+ Eigen::MatrixXi mark = Eigen::MatrixXi::Zero(V.rows(),1);
|
|
|
|
|
|
for(int i=0; i<F.rows(); ++i)
|
|
for(int i=0; i<F.rows(); ++i)
|
|
{
|
|
{
|
|
for(int j=0; j<F.cols(); ++j)
|
|
for(int j=0; j<F.cols(); ++j)
|
|
{
|
|
{
|
|
if (F(i,j) != -1)
|
|
if (F(i,j) != -1)
|
|
- mark(F(i,j),0) = 1;
|
|
|
|
|
|
+ mark(F(i,j)) = 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// Sum the occupied cells
|
|
// Sum the occupied cells
|
|
int newsize = mark.sum();
|
|
int newsize = mark.sum();
|
|
|
|
|
|
- NV = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>(newsize,V.cols());
|
|
|
|
- NF = Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic>(F.rows(),F.cols());
|
|
|
|
- I = Eigen::Matrix<S, Eigen::Dynamic, 1>(V.rows(),1);
|
|
|
|
|
|
+ NV.resize(newsize,V.cols());
|
|
|
|
+ I.resize(V.rows(),1);
|
|
|
|
|
|
// Do a pass on the marked vector and remove the unreferenced vertices
|
|
// Do a pass on the marked vector and remove the unreferenced vertices
|
|
int count = 0;
|
|
int count = 0;
|
|
@@ -50,21 +50,80 @@ IGL_INLINE void igl::removeUnreferenced(
|
|
I(i) = -1;
|
|
I(i) = -1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+ NF.resize(F.rows(),F.cols());
|
|
|
|
+
|
|
// Apply I on F
|
|
// Apply I on F
|
|
-
|
|
|
|
- // Why is this also removing combinatorially degenerate faces?
|
|
|
|
- count = 0;
|
|
|
|
- for (int i =0; i<F.rows(); ++i)
|
|
|
|
|
|
+ for (int i=0; i<F.rows(); ++i)
|
|
{
|
|
{
|
|
- int v0 = I[F(i,0)];
|
|
|
|
- int v1 = I[F(i,1)];
|
|
|
|
- int v2 = I[F(i,2)];
|
|
|
|
- if ( (v0 != v1) && (v2 != v1) && (v0 != v2) )
|
|
|
|
- NF.row(count++) << v0, v1, v2;
|
|
|
|
|
|
+ Eigen::RowVectorXi t(F.cols());
|
|
|
|
+ for (int j=0; j<F.cols(); ++j)
|
|
|
|
+ t(j) = I(F(i,j));
|
|
|
|
+
|
|
|
|
+ NF.row(i) = t;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// template <typename T, typename S>
|
|
|
|
+// IGL_INLINE void removeUnreferenced(
|
|
|
|
+// const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &V,
|
|
|
|
+// const vector<vector<S> > &F,
|
|
|
|
+// Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &NV,
|
|
|
|
+// const vector<vector<S> > &NF,
|
|
|
|
+// Eigen::Matrix<S, Eigen::Dynamic, 1> &I)
|
|
|
|
+//{
|
|
|
|
+// // Mark referenced vertices
|
|
|
|
+// Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic> mark = Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic>::Zero(V.rows(),1);
|
|
|
|
+//
|
|
|
|
+// for(int i=0; i<F.size(); ++i)
|
|
|
|
+// {
|
|
|
|
+// for(int j=0; j<F[i].size(); ++j)
|
|
|
|
+// {
|
|
|
|
+// if (F[i][j] != -1)
|
|
|
|
+// mark(F[i][j],0) = 1;
|
|
|
|
+// }
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+// // Sum the occupied cells
|
|
|
|
+// int newsize = mark.sum();
|
|
|
|
+//
|
|
|
|
+// NV = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>(newsize,V.cols());
|
|
|
|
+// NF.clear();
|
|
|
|
+// I = Eigen::Matrix<S, Eigen::Dynamic, 1>(V.rows(),1);
|
|
|
|
+//
|
|
|
|
+// // Do a pass on the marked vector and remove the unreferenced vertices
|
|
|
|
+// int count = 0;
|
|
|
|
+// for(int i=0;i<mark.rows();++i)
|
|
|
|
+// {
|
|
|
|
+// if (mark(i) == 1)
|
|
|
|
+// {
|
|
|
|
+// NV.row(count) = V.row(i);
|
|
|
|
+// I(i) = count;
|
|
|
|
+// count++;
|
|
|
|
+// }
|
|
|
|
+// else
|
|
|
|
+// {
|
|
|
|
+// I(i) = -1;
|
|
|
|
+// }
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+// // Apply I on F
|
|
|
|
+// for (int i=0; i<F.size(); ++i)
|
|
|
|
+// {
|
|
|
|
+// vector<S> t;
|
|
|
|
+// for (int j=0; j<F[i].size(); ++j)
|
|
|
|
+// t.push_back(I[F[i][j]]);
|
|
|
|
+//
|
|
|
|
+// vector<S> t_copy = t;
|
|
|
|
+// typename std::vector<S>::iterator it;
|
|
|
|
+// it = std::unique (t_copy.begin(), t_copy.end());
|
|
|
|
+// t_copy.resize( std::distance(t_copy.begin(),it) );
|
|
|
|
+//
|
|
|
|
+// if (t_copy.size() > 2)
|
|
|
|
+// NF.push_back(t);
|
|
|
|
+// }
|
|
|
|
+//}
|
|
|
|
+
|
|
#ifndef IGL_HEADER_ONLY
|
|
#ifndef IGL_HEADER_ONLY
|
|
// Explicit template specialization
|
|
// Explicit template specialization
|
|
#endif
|
|
#endif
|