add_barycenter.cpp 1009 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #include "add_barycenter.h"
  2. #include "verbose.h"
  3. #include <algorithm>
  4. #include <igl/barycenter.h>
  5. template <typename Scalar, typename Index>
  6. IGL_INLINE void igl::add_barycenter(
  7. const Eigen::PlainObjectBase<Scalar> & V,
  8. const Eigen::PlainObjectBase<Index> & F,
  9. Eigen::PlainObjectBase<Scalar> & VD,
  10. Eigen::PlainObjectBase<Index> & FD)
  11. {
  12. using namespace Eigen;
  13. // Compute face barycenter
  14. Eigen::MatrixXd BC;
  15. igl::barycenter(V,F,BC);
  16. // Add the barycenters to the vertices
  17. VD.resize(V.rows()+F.rows(),3);
  18. VD.block(0,0,V.rows(),3) = V;
  19. VD.block(V.rows(),0,F.rows(),3) = BC;
  20. // Each face is split four ways
  21. FD.resize(F.rows()*3,3);
  22. for (unsigned i=0; i<F.rows(); ++i)
  23. {
  24. int i0 = F(i,0);
  25. int i1 = F(i,1);
  26. int i2 = F(i,2);
  27. int i3 = V.rows() + i;
  28. Vector3i F0,F1,F2;
  29. F0 << i0,i1,i3;
  30. F1 << i1,i2,i3;
  31. F2 << i2,i0,i3;
  32. FD.row(i*3 + 0) = F0;
  33. FD.row(i*3 + 1) = F1;
  34. FD.row(i*3 + 2) = F2;
  35. }
  36. }
  37. #ifndef IGL_HEADER_ONLY
  38. // Explicit template specialization
  39. #endif