|
@@ -1,20 +1,20 @@
|
|
|
|
|
|
-
|
|
+
|
|
|
|
|
|
-
|
|
+
|
|
-
|
|
+
|
|
-
|
|
+
|
|
|
|
|
|
#include "grad.h"
|
|
#include "grad.h"
|
|
#include <Eigen/Geometry>
|
|
#include <Eigen/Geometry>
|
|
#include <vector>
|
|
#include <vector>
|
|
|
|
|
|
-template <typename T, typename S>
|
|
+template <typename DerivedV, typename DerivedF>
|
|
-IGL_INLINE void igl::grad(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &V,
|
|
+IGL_INLINE void igl::grad(const Eigen::PlainObjectBase<DerivedV>&V,
|
|
- const Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic> &F,
|
|
+ const Eigen::PlainObjectBase<DerivedF>&F,
|
|
- Eigen::SparseMatrix<T> &G )
|
|
+ Eigen::SparseMatrix<typename DerivedV::Scalar> &G)
|
|
{
|
|
{
|
|
- Eigen::PlainObjectBase<Eigen::Matrix<T,Eigen::Dynamic,3> > eperp21, eperp13;
|
|
+ Eigen::PlainObjectBase<DerivedV > eperp21, eperp13;
|
|
eperp21.resize(F.rows(),3);
|
|
eperp21.resize(F.rows(),3);
|
|
eperp13.resize(F.rows(),3);
|
|
eperp13.resize(F.rows(),3);
|
|
|
|
|
|
@@ -24,23 +24,23 @@ IGL_INLINE void igl::grad(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
|
|
int i1 = F(i,0);
|
|
int i1 = F(i,0);
|
|
int i2 = F(i,1);
|
|
int i2 = F(i,1);
|
|
int i3 = F(i,2);
|
|
int i3 = F(i,2);
|
|
-
|
|
+
|
|
|
|
|
|
- Eigen::Matrix<T, 1, 3> v32 = V.row(i3) - V.row(i2);
|
|
+ Eigen::Matrix<typename DerivedV::Scalar, 1, 3> v32 = V.row(i3) - V.row(i2);
|
|
- Eigen::Matrix<T, 1, 3> v13 = V.row(i1) - V.row(i3);
|
|
+ Eigen::Matrix<typename DerivedV::Scalar, 1, 3> v13 = V.row(i1) - V.row(i3);
|
|
- Eigen::Matrix<T, 1, 3> v21 = V.row(i2) - V.row(i1);
|
|
+ Eigen::Matrix<typename DerivedV::Scalar, 1, 3> v21 = V.row(i2) - V.row(i1);
|
|
-
|
|
+
|
|
|
|
|
|
-
|
|
+
|
|
- Eigen::Matrix<T, 1, 3> n = v32.cross(v13);
|
|
+ Eigen::Matrix<typename DerivedV::Scalar, 1, 3> n = v32.cross(v13);
|
|
-
|
|
+
|
|
|
|
|
|
|
|
|
|
double dblA = std::sqrt(n.dot(n));
|
|
double dblA = std::sqrt(n.dot(n));
|
|
-
|
|
+
|
|
|
|
|
|
- Eigen::Matrix<T, 1, 3> u = n / dblA;
|
|
+ Eigen::Matrix<typename DerivedV::Scalar, 1, 3> u = n / dblA;
|
|
-
|
|
+
|
|
|
|
|
|
double norm21 = std::sqrt(v21.dot(v21));
|
|
double norm21 = std::sqrt(v21.dot(v21));
|
|
double norm13 = std::sqrt(v13.dot(v13));
|
|
double norm13 = std::sqrt(v13.dot(v13));
|
|
@@ -76,7 +76,7 @@ IGL_INLINE void igl::grad(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
|
|
for(int i=0;i<F.rows();i++) cs.push_back(F(i,2));
|
|
for(int i=0;i<F.rows();i++) cs.push_back(F(i,2));
|
|
for(int i=0;i<F.rows();i++) cs.push_back(F(i,0));
|
|
for(int i=0;i<F.rows();i++) cs.push_back(F(i,0));
|
|
}
|
|
}
|
|
-
|
|
+
|
|
|
|
|
|
for(int i=0;i<F.rows();i++) vs.push_back(eperp13(i,0));
|
|
for(int i=0;i<F.rows();i++) vs.push_back(eperp13(i,0));
|
|
for(int i=0;i<F.rows();i++) vs.push_back(-eperp13(i,0));
|
|
for(int i=0;i<F.rows();i++) vs.push_back(-eperp13(i,0));
|
|
@@ -92,17 +92,17 @@ IGL_INLINE void igl::grad(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
|
|
for(int i=0;i<F.rows();i++) vs.push_back(-eperp21(i,2));
|
|
for(int i=0;i<F.rows();i++) vs.push_back(-eperp21(i,2));
|
|
|
|
|
|
|
|
|
|
- G.resize(3*F.rows(),V.rows());
|
|
+ G.resize(3*F.rows(),V.rows());
|
|
- std::vector<Eigen::Triplet<T> > triplets;
|
|
+ std::vector<Eigen::Triplet<typename DerivedV::Scalar> > triplets;
|
|
for (int i=0;i<(int)vs.size();++i)
|
|
for (int i=0;i<(int)vs.size();++i)
|
|
{
|
|
{
|
|
- triplets.push_back(Eigen::Triplet<T>(rs[i],cs[i],vs[i]));
|
|
+ triplets.push_back(Eigen::Triplet<typename DerivedV::Scalar>(rs[i],cs[i],vs[i]));
|
|
}
|
|
}
|
|
G.setFromTriplets(triplets.begin(), triplets.end());
|
|
G.setFromTriplets(triplets.begin(), triplets.end());
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef IGL_STATIC_LIBRARY
|
|
#ifdef IGL_STATIC_LIBRARY
|
|
|
|
|
|
-template void igl::grad<double, int>(Eigen::Matrix<double, -1, -1, 0, -1,-1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&,Eigen::SparseMatrix<double, 0, int>&);
|
|
+
|
|
|
|
+template void igl::grad<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::SparseMatrix<Eigen::Matrix<double, -1, 3, 0, -1, 3>::Scalar, 0, int>&);
|
|
#endif
|
|
#endif
|
|
-
|
|
|