// This file is part of libigl, a simple c++ geometry processing library. // // Copyright (C) 2014 Daniele Panozzo // // 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 "lscm.h" #include "vector_area_matrix.h" #include "cotmatrix.h" #include "repdiag.h" #include "min_quad_with_fixed.h" #include IGL_INLINE bool igl::lscm( const Eigen::MatrixXd& V, const Eigen::MatrixXi& F, const Eigen::VectorXi& b, const Eigen::MatrixXd& bc, Eigen::MatrixXd & V_uv) { using namespace Eigen; using namespace std; // Assemble the area matrix (note that A is #Vx2 by #Vx2) SparseMatrix A; igl::vector_area_matrix(F,A); // Assemble the cotan laplacian matrix SparseMatrix L; igl::cotmatrix(V,F,L); SparseMatrix L_flat; repdiag(L,2,L_flat); VectorXi b_flat(b.size()*bc.cols(),1); VectorXd bc_flat(bc.size(),1); for(int c = 0;c Q = -L_flat + 2.*A; const VectorXd B_flat = VectorXd::Zero(V.rows()*2); igl::min_quad_with_fixed_data data; if(!igl::min_quad_with_fixed_precompute(Q,b_flat,SparseMatrix(),true,data)) { return false; } MatrixXd W_flat; if(!min_quad_with_fixed_solve(data,B_flat,bc_flat,VectorXd(),W_flat)) { return false; } assert(W_flat.rows() == V.rows()*2); V_uv.resize(V.rows(),2); for (unsigned i=0;i