pos.h 2.3 KB

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