moveFV.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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 IGL_MOVEFV_h
  9. #define IGL_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. // Implementation
  28. template <typename T>
  29. inline void igl::moveFV(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &V,
  30. const Eigen::MatrixXi &F,
  31. const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &S,
  32. Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &SV)
  33. {
  34. SV = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>::Zero(V.rows(),S.cols());
  35. Eigen::Matrix<T, Eigen::Dynamic, 1> COUNT = Eigen::Matrix<T, Eigen::Dynamic, 1>::Zero(V.rows());
  36. for (int i = 0; i <F.rows(); ++i)
  37. {
  38. for (int j = 0; j<F.cols(); ++j)
  39. {
  40. SV.row(F(i,j)) += S.row(i);
  41. COUNT[F(i,j)] ++;
  42. }
  43. }
  44. for (int i = 0; i <V.rows(); ++i)
  45. SV.row(i) /= COUNT[i];
  46. };
  47. #endif