pos.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. class Pos
  13. {
  14. public:
  15. // Init the pos by specifying Face,Edge Index and Orientation
  16. Pos(const Eigen::MatrixXi* F,
  17. Eigen::MatrixXi* FF,
  18. Eigen::MatrixXi* FFi,
  19. int fi,
  20. int ei,
  21. bool reverse = false
  22. )
  23. : F(F), FF(FF), FFi(FFi), fi(fi), ei(ei), reverse(reverse)
  24. {}
  25. // // Init the pos by specifying Face,Vertex Index and Orientation
  26. // Pos(Eigen::MatrixXi& F,
  27. // Eigen::MatrixXi& FF,
  28. // Eigen::MatrixXi& FFi,
  29. // int fi,
  30. // int vi,
  31. // bool reverse = false
  32. // )
  33. // : F(F), FF(FF), FFi(FFi), fi(fi), reverse(reverse)
  34. // {
  35. // ei = -1;
  36. // for (int i=0;i<3;++i)
  37. // if (F(fi,i) == vi)
  38. // ei = i;
  39. // assert(ei != -1);
  40. //
  41. // if (reverse)
  42. // ei = (ei-1)%3;
  43. // }
  44. // Change Face
  45. void flipF()
  46. {
  47. int fin = (*FF)(fi,ei);
  48. int ein = (*FFi)(fi,ei);
  49. int reversen = !reverse;
  50. fi = fin;
  51. ei = ein;
  52. reverse = reversen;
  53. }
  54. // Change Edge
  55. void flipE()
  56. {
  57. if (!reverse)
  58. ei = (ei+2)%3; // ei-1
  59. else
  60. ei = (ei+1)%3;
  61. reverse = !reverse;
  62. }
  63. // Change Vertex
  64. void flipV()
  65. {
  66. reverse = !reverse;
  67. }
  68. // Get vertex index
  69. int Vi()
  70. {
  71. assert(fi >= 0);
  72. assert(fi < F->rows());
  73. assert(ei >= 0);
  74. assert(ei <= 2);
  75. if (!reverse)
  76. return (*F)(fi,ei);
  77. else
  78. return (*F)(fi,(ei+1)%3);
  79. }
  80. // Get face index
  81. int Fi()
  82. {
  83. return fi;
  84. }
  85. bool operator==(Pos& p2)
  86. {
  87. return
  88. (
  89. (fi == p2.fi) &&
  90. (ei == p2.ei) &&
  91. (reverse == p2.reverse) &&
  92. (F == p2.F) &&
  93. (FF == p2.FF) &&
  94. (FFi == p2.FFi)
  95. );
  96. }
  97. int fi;
  98. int ei;
  99. bool reverse;
  100. const Eigen::MatrixXi* F;
  101. Eigen::MatrixXi* FF;
  102. Eigen::MatrixXi* FFi;
  103. };
  104. }
  105. #endif