// This file is part of libigl, a simple c++ geometry processing library. // // Copyright (C) 2013 Alec Jacobson // // 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 "grad.h" template IGL_INLINE void igl::grad(const Eigen::Matrix &V, const Eigen::Matrix &F, const Eigen::Matrix&X, Eigen::Matrix &G ) { G = Eigen::Matrix::Zero(F.rows(),3); for (int i = 0; i v32 = V.row(i3) - V.row(i2); Eigen::Matrix v13 = V.row(i1) - V.row(i3); Eigen::Matrix v21 = V.row(i2) - V.row(i1); // area of parallelogram is twice area of triangle // area of parallelogram is || v1 x v2 || Eigen::Matrix n = v32.cross(v13); // This does correct l2 norm of rows, so that it contains #F list of twice // triangle areas double dblA = std::sqrt(n.dot(n)); // now normalize normals to get unit normals Eigen::Matrix u = n / dblA; // rotate each vector 90 degrees around normal double norm21 = std::sqrt(v21.dot(v21)); double norm13 = std::sqrt(v13.dot(v13)); Eigen::Matrix eperp21 = u.cross(v21); eperp21 = eperp21 / std::sqrt(eperp21.dot(eperp21)); eperp21 *= norm21; Eigen::Matrix eperp13 = u.cross(v13); eperp13 = eperp13 / std::sqrt(eperp13.dot(eperp13)); eperp13 *= norm13; G.row(i) = ((X[i2] -X[i1]) *eperp13 + (X[i3] - X[i1]) *eperp21) / dblA; }; } #ifndef IGL_HEADER_ONLY // Explicit template specialization #endif