123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- #ifndef IGL_POS_H
- #define IGL_POS_H
- #include <Eigen/Core>
- #include <vector>
- namespace igl
- {
- // Pos - Fake halfedge for fast and easy navigation on triangle meshes with VT and TT adj
- template <typename S>
- class Pos
- {
- public:
- // Init the pos by specifying Face,Edge Index and Orientation
- Pos(const Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic>* F,
- Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic>* FF,
- Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic>* FFi,
- int fi,
- int ei,
- bool reverse = false
- )
- : F(F), FF(FF), FFi(FFi), fi(fi), ei(ei), reverse(reverse)
- {}
- // // Init the pos by specifying Face,Vertex Index and Orientation
- // Pos(Eigen::MatrixXi& F,
- // Eigen::MatrixXi& FF,
- // Eigen::MatrixXi& FFi,
- // int fi,
- // int vi,
- // bool reverse = false
- // )
- // : F(F), FF(FF), FFi(FFi), fi(fi), reverse(reverse)
- // {
- // ei = -1;
- // for (int i=0;i<3;++i)
- // if (F(fi,i) == vi)
- // ei = i;
- // assert(ei != -1);
- //
- // if (reverse)
- // ei = (ei-1)%3;
- // }
-
- // Change Face
- void flipF()
- {
- int fin = (*FF)(fi,ei);
- int ein = (*FFi)(fi,ei);
- int reversen = !reverse;
-
- fi = fin;
- ei = ein;
- reverse = reversen;
- }
-
- // Change Edge
- void flipE()
- {
- if (!reverse)
- ei = (ei+2)%3; // ei-1
- else
- ei = (ei+1)%3;
- reverse = !reverse;
- }
-
- // Change Vertex
- void flipV()
- {
- reverse = !reverse;
- }
-
- // Get vertex index
- int Vi()
- {
- assert(fi >= 0);
- assert(fi < F->rows());
- assert(ei >= 0);
- assert(ei <= 2);
-
- if (!reverse)
- return (*F)(fi,ei);
- else
- return (*F)(fi,(ei+1)%3);
- }
-
- // Get face index
- int Fi()
- {
- return fi;
- }
-
- bool operator==(Pos& p2)
- {
- return
- (
- (fi == p2.fi) &&
- (ei == p2.ei) &&
- (reverse == p2.reverse) &&
- (F == p2.F) &&
- (FF == p2.FF) &&
- (FFi == p2.FFi)
- );
- }
-
- int fi;
- int ei;
- bool reverse;
-
- const Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic>* F;
- Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic>* FF;
- Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic>* FFi;
- };
-
- }
- #endif
|