// This file is part of libigl, a simple c++ geometry processing library. // // Copyright (C) 2020 Oded Stein // // This Source Code Form is subject to the terms of the Mozilla Public License // v. 2.0. If a copy of the MPL was not distributed with this file, You can // obtain one at http://mozilla.org/MPL/2.0/. #include "cr_vector_laplacian.h" #include #include "orient_halfedges.h" #include "doublearea.h" #include "squared_edge_lengths.h" template IGL_INLINE void igl::cr_vector_laplacian( const Eigen::MatrixBase& V, const Eigen::MatrixBase& F, const Eigen::MatrixBase& E, const Eigen::MatrixBase& oE, Eigen::SparseMatrix& L) { Eigen::Matrix l_sq; squared_edge_lengths(V, F, l_sq); cr_vector_laplacian_intrinsic(F, l_sq, E, oE, L); } template IGL_INLINE void igl::cr_vector_laplacian( const Eigen::MatrixBase& V, const Eigen::MatrixBase& F, Eigen::PlainObjectBase& E, Eigen::PlainObjectBase& oE, Eigen::SparseMatrix& L) { if(E.rows()!=F.rows() || E.cols()!=F.cols() || oE.rows()!=F.rows() || oE.cols()!=F.cols()) { orient_halfedges(F, E, oE); } const Eigen::PlainObjectBase& cE = E; const Eigen::PlainObjectBase& coE = oE; cr_vector_laplacian(V, F, cE, coE, L); } template IGL_INLINE void igl::cr_vector_laplacian_intrinsic( const Eigen::MatrixBase& F, const Eigen::MatrixBase& l_sq, const Eigen::MatrixBase& E, const Eigen::MatrixBase& oE, Eigen::SparseMatrix& L) { Eigen::Matrix dA; DerivedL_sq l_sqrt = l_sq.array().sqrt().matrix(); doublearea(l_sqrt, dA); cr_vector_laplacian_intrinsic(F, l_sq, dA, E, oE, L); } template IGL_INLINE void igl::cr_vector_laplacian_intrinsic( const Eigen::MatrixBase& F, const Eigen::MatrixBase& l_sq, const Eigen::MatrixBase& dA, const Eigen::MatrixBase& E, const Eigen::MatrixBase& oE, Eigen::SparseMatrix& L) { assert(F.cols()==3 && "Faces have three vertices"); assert(E.rows()==F.rows() && E.cols()==F.cols() && oE.rows()==F.rows() && oE.cols()==F.cols() && "Wrong dimension in edge vectors"); assert(l_sq.rows()==F.rows() && l_sq.cols()==3 && "l_sq dimensions wrong"); assert(dA.size()==F.rows() && "dA dimensions wrong"); const Eigen::Index m = F.rows(); const typename DerivedE::Scalar nE = E.maxCoeff() + 1; std::vector > tripletList; tripletList.reserve(10*3*m); for(Eigen::Index f=0; f, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, double>(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::SparseMatrix&); template void igl::cr_vector_laplacian_intrinsic, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, double>(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::SparseMatrix&); #endif