pos.h 2.5 KB

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