per_face_normals.cpp 793 B

12345678910111213141516171819202122232425262728293031
  1. #include "per_face_normals.h"
  2. IGL_INLINE void igl::per_face_normals(
  3. const Eigen::MatrixXd & V,
  4. const Eigen::MatrixXi & F,
  5. Eigen::MatrixXd & N)
  6. {
  7. N.resize(F.rows(),3);
  8. // loop over faces
  9. for(int i = 0; i < F.rows();i++)
  10. {
  11. float v1[3];
  12. v1[0] = V(F(i,1),0) - V(F(i,0),0);
  13. v1[1] = V(F(i,1),1) - V(F(i,0),1);
  14. v1[2] = V(F(i,1),2) - V(F(i,0),2);
  15. float v2[3];
  16. v2[0] = V(F(i,2),0) - V(F(i,0),0);
  17. v2[1] = V(F(i,2),1) - V(F(i,0),1);
  18. v2[2] = V(F(i,2),2) - V(F(i,0),2);
  19. N(i,0) = v1[1]*v2[2] - v1[2]*v2[1];
  20. N(i,1) = -(v1[0]*v2[2] - v1[2]*v2[0]);
  21. N(i,2) = v1[0]*v2[1] - v1[1]*v2[0];
  22. float length = sqrt(
  23. N(i,0)*N(i,0) +
  24. N(i,1)*N(i,1) +
  25. N(i,2)*N(i,2));
  26. N(i,0) /= length;
  27. N(i,1) /= length;
  28. N(i,2) /= length;
  29. }
  30. }