pos.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #ifndef IGL_POS_H
  2. #define IGL_POS_H
  3. #include <Eigen/Core>
  4. #include <vector>
  5. namespace igl
  6. {
  7. // Pos - Fake halfedge for fast and easy navigation on triangle meshes with VT and TT adj
  8. template <typename S>
  9. class Pos
  10. {
  11. public:
  12. // Init the pos by specifying Face,Edge Index and Orientation
  13. Pos(const Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic>* F,
  14. Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic>* FF,
  15. Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic>* FFi,
  16. int fi,
  17. int ei,
  18. bool reverse = false
  19. )
  20. : F(F), FF(FF), FFi(FFi), fi(fi), ei(ei), reverse(reverse)
  21. {}
  22. // // Init the pos by specifying Face,Vertex Index and Orientation
  23. // Pos(Eigen::MatrixXi& F,
  24. // Eigen::MatrixXi& FF,
  25. // Eigen::MatrixXi& FFi,
  26. // int fi,
  27. // int vi,
  28. // bool reverse = false
  29. // )
  30. // : F(F), FF(FF), FFi(FFi), fi(fi), reverse(reverse)
  31. // {
  32. // ei = -1;
  33. // for (int i=0;i<3;++i)
  34. // if (F(fi,i) == vi)
  35. // ei = i;
  36. // assert(ei != -1);
  37. //
  38. // if (reverse)
  39. // ei = (ei-1)%3;
  40. // }
  41. // Change Face
  42. void flipF()
  43. {
  44. int fin = (*FF)(fi,ei);
  45. int ein = (*FFi)(fi,ei);
  46. int reversen = !reverse;
  47. fi = fin;
  48. ei = ein;
  49. reverse = reversen;
  50. }
  51. // Change Edge
  52. void flipE()
  53. {
  54. if (!reverse)
  55. ei = (ei+2)%3; // ei-1
  56. else
  57. ei = (ei+1)%3;
  58. reverse = !reverse;
  59. }
  60. // Change Vertex
  61. void flipV()
  62. {
  63. reverse = !reverse;
  64. }
  65. // Get vertex index
  66. int Vi()
  67. {
  68. assert(fi >= 0);
  69. assert(fi < F->rows());
  70. assert(ei >= 0);
  71. assert(ei <= 2);
  72. if (!reverse)
  73. return (*F)(fi,ei);
  74. else
  75. return (*F)(fi,(ei+1)%3);
  76. }
  77. // Get face index
  78. int Fi()
  79. {
  80. return fi;
  81. }
  82. bool operator==(Pos& p2)
  83. {
  84. return
  85. (
  86. (fi == p2.fi) &&
  87. (ei == p2.ei) &&
  88. (reverse == p2.reverse) &&
  89. (F == p2.F) &&
  90. (FF == p2.FF) &&
  91. (FFi == p2.FFi)
  92. );
  93. }
  94. int fi;
  95. int ei;
  96. bool reverse;
  97. const Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic>* F;
  98. Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic>* FF;
  99. Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic>* FFi;
  100. };
  101. }
  102. #endif