moveFV.h 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. //
  2. // moveFV.h
  3. // Preview3D
  4. //
  5. // Created by Olga Diamanti on 11/11/11.
  6. // Copyright (c) 2011 __MyCompanyName__. All rights reserved.
  7. //
  8. #ifndef Preview3D_moveFV_h
  9. #define Preview3D_moveFV_h
  10. namespace igl
  11. {
  12. // moveFV
  13. // Move a scalar field defined on faces to vertices by averaging
  14. //
  15. // Input:
  16. // V,F: mesh
  17. // S: scalar field defined on faces, Fx1
  18. //
  19. // Output:
  20. // SV: scalar field defined on vertices
  21. template <typename T>
  22. inline void moveFV(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &V,
  23. const Eigen::MatrixXi &F,
  24. const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &S,
  25. Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &SV);
  26. }
  27. template <typename T>
  28. inline void igl::moveFV(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &V,
  29. const Eigen::MatrixXi &F,
  30. const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &S,
  31. Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &SV)
  32. {
  33. SV = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>::Zero(V.rows(),S.cols());
  34. Eigen::Matrix<T, Eigen::Dynamic, 1> COUNT = Eigen::Matrix<T, Eigen::Dynamic, 1>::Zero(V.rows());
  35. for (int i = 0; i <F.rows(); ++i)
  36. {
  37. for (int j = 0; j<F.cols(); ++j)
  38. {
  39. SV.row(F(i,j)) += S.row(i);
  40. COUNT[F(i,j)] ++;
  41. }
  42. }
  43. for (int i = 0; i <V.rows(); ++i)
  44. SV.row(i) /= COUNT[i];
  45. };
  46. #endif