123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- #include "circulation.h"
- #include "list_to_matrix.h"
- #include <cassert>
- IGL_INLINE std::vector<int> igl::circulation(
- const int e,
- const bool ccw,
- const Eigen::VectorXi & EMAP,
- const Eigen::MatrixXi & EF,
- const Eigen::MatrixXi & EI)
- {
-
- std::vector<int> N;
- N.reserve(6);
- const int m = EMAP.size()/3;
- assert(m*3 == EMAP.size());
- const auto & step = [&](
- const int e,
- const int ff,
- int & ne,
- int & nf)
- {
- assert((EF(e,1) == ff || EF(e,0) == ff) && "e should touch ff");
-
- const int nside = EF(e,0)==ff?1:0;
- const int nv = EI(e,nside);
-
- nf = EF(e,nside);
-
- const int dir = ccw?-1:1;
- ne = EMAP(nf+m*((nv+dir+3)%3));
- };
-
-
- const int f0 = EF(e,0);
- int fi = f0;
- int ei = e;
- while(true)
- {
- step(ei,fi,ei,fi);
- N.push_back(fi);
-
- if(fi == f0)
- {
- assert(ei == e);
- break;
- }
- }
- return N;
- }
- IGL_INLINE void igl::circulation(
- const int e,
- const bool ccw,
- const Eigen::VectorXi & EMAP,
- const Eigen::MatrixXi & EF,
- const Eigen::MatrixXi & EI,
- Eigen::VectorXi & vN)
- {
- std::vector<int> N = circulation(e,ccw,EMAP,EF,EI);
- igl::list_to_matrix(N,vN);
- }
|