find_cross_field_singularities.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include "find_cross_field_singularities.h"
  2. #include "cross_field_missmatch.h"
  3. #include <vector>
  4. #include "is_border_vertex.h"
  5. #include "vf.h"
  6. #include "is_border_vertex.h"
  7. #include "cross_field_missmatch.h"
  8. template <typename DerivedV, typename DerivedF, typename DerivedM, typename DerivedO>
  9. IGL_INLINE void igl::find_cross_field_singularities(const Eigen::PlainObjectBase<DerivedV> &V,
  10. const Eigen::PlainObjectBase<DerivedF> &F,
  11. const Eigen::PlainObjectBase<DerivedM> &Handle_MMatch,
  12. Eigen::PlainObjectBase<DerivedO> &isSingularity,
  13. Eigen::PlainObjectBase<DerivedO> &singularityIndex)
  14. {
  15. std::vector<bool> V_border = igl::is_border_vertex(V,F);
  16. std::vector<std::vector<int> > VF;
  17. std::vector<std::vector<int> > VFi;
  18. igl::vf(V,F,VF,VFi);
  19. isSingularity.setZero(V.rows(),1);
  20. singularityIndex.setZero(V.rows(),1);
  21. for (unsigned int vid=0;vid<V.rows();vid++)
  22. {
  23. ///check that is on border..
  24. if (V_border[vid])
  25. return;
  26. int missmatch=0;
  27. for (unsigned int i=0;i<VF[vid].size();i++)
  28. {
  29. // look for the vertex
  30. int j=-1;
  31. for (unsigned z=0; z<3; ++z)
  32. if (F(VF[vid][i],z) == vid)
  33. j=z;
  34. assert(j!=-1);
  35. missmatch+=Handle_MMatch(VF[vid][i],j);
  36. }
  37. missmatch=missmatch%4;
  38. isSingularity(vid)=(missmatch!=0);
  39. singularityIndex(vid)=missmatch;
  40. }
  41. }
  42. template <typename DerivedV, typename DerivedF, typename DerivedO>
  43. IGL_INLINE void igl::find_cross_field_singularities(const Eigen::PlainObjectBase<DerivedV> &V,
  44. const Eigen::PlainObjectBase<DerivedF> &F,
  45. const Eigen::PlainObjectBase<DerivedV> &PD1,
  46. const Eigen::PlainObjectBase<DerivedV> &PD2,
  47. Eigen::PlainObjectBase<DerivedO> &isSingularity,
  48. Eigen::PlainObjectBase<DerivedO> &singularityIndex)
  49. {
  50. Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 3> Handle_MMatch;
  51. igl::cross_field_missmatch<DerivedV, DerivedF, DerivedO>(V, F, PD1, PD2, Handle_MMatch);
  52. igl::find_cross_field_singularities(V, F, Handle_MMatch, isSingularity, singularityIndex);
  53. }