123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- #include "exterior_edges.h"
- #include "oriented_facets.h"
- #include "sort.h"
- #include "unique_rows.h"
- #include <cassert>
- #include <unordered_map>
- #include <utility>
- #include <iostream>
- IGL_INLINE void igl::exterior_edges(
- const Eigen::MatrixXi & F,
- Eigen::MatrixXi & E)
- {
- using namespace Eigen;
- using namespace std;
- assert(F.cols() == 3);
- const size_t m = F.rows();
- MatrixXi all_E,sall_E,sort_order;
-
- oriented_facets(F,all_E);
- sort(all_E,2,true,sall_E,sort_order);
-
- MatrixXi uE;
- VectorXi IA,EMAP;
- unique_rows(sall_E,uE,IA,EMAP);
- VectorXi counts = VectorXi::Zero(uE.rows());
- for(size_t a = 0;a<3*m;a++)
- {
- counts(EMAP(a)) += (sort_order(a)==0?1:-1);
- }
- E.resize(all_E.rows(),2);
- {
- int e = 0;
- const size_t nue = uE.rows();
-
- for(size_t ue = 0; ue<nue; ue++)
- {
- const int count = counts(ue);
- size_t i,j;
- if(count == 0)
- {
- continue;
- }else if(count < 0)
- {
- i = uE(ue,1);
- j = uE(ue,0);
- }else if(count > 0)
- {
- i = uE(ue,0);
- j = uE(ue,1);
- }
-
- const int abs_count = abs(count);
- for(int k = 0;k<abs_count;k++)
- {
- E(e,0) = i;
- E(e,1) = j;
- e++;
- }
- }
- E.conservativeResize(e,2);
- }
- }
- IGL_INLINE Eigen::MatrixXi igl::exterior_edges( const Eigen::MatrixXi & F)
- {
- using namespace Eigen;
- MatrixXi E;
- exterior_edges(F,E);
- return E;
- }
|