| 12345678910111213141516171819202122232425262728293031 |
- #include "per_face_normals.h"
- IGL_INLINE void igl::per_face_normals(
- const Eigen::MatrixXd & V,
- const Eigen::MatrixXi & F,
- Eigen::MatrixXd & N)
- {
- N.resize(F.rows(),3);
- // loop over faces
- for(int i = 0; i < F.rows();i++)
- {
- float v1[3];
- v1[0] = V(F(i,1),0) - V(F(i,0),0);
- v1[1] = V(F(i,1),1) - V(F(i,0),1);
- v1[2] = V(F(i,1),2) - V(F(i,0),2);
- float v2[3];
- v2[0] = V(F(i,2),0) - V(F(i,0),0);
- v2[1] = V(F(i,2),1) - V(F(i,0),1);
- v2[2] = V(F(i,2),2) - V(F(i,0),2);
- N(i,0) = v1[1]*v2[2] - v1[2]*v2[1];
- N(i,1) = -(v1[0]*v2[2] - v1[2]*v2[0]);
- N(i,2) = v1[0]*v2[1] - v1[1]*v2[0];
- float length = sqrt(
- N(i,0)*N(i,0) +
- N(i,1)*N(i,1) +
- N(i,2)*N(i,2));
- N(i,0) /= length;
- N(i,1) /= length;
- N(i,2) /= length;
- }
- }
|