void mark_domains(CDT& ct, CDT::Face_handle start, int index, std::list<CDT::Edge>& border ) { if(start->info().nesting_level != -1){ return; } std::list<CDT::Face_handle> queue; queue.push_back(start); while(! queue.empty()){ CDT::Face_handle fh = queue.front(); queue.pop_front(); if(fh->info().nesting_level == -1){ fh->info().nesting_level = index; for(int i = 0; i < 3; i++){ CDT::Edge e(fh,i); CDT::Face_handle n = fh->neighbor(i); if(n->info().nesting_level == -1){ if(ct.is_constrained(e)) border.push_back(e); else queue.push_back(n); } } } } }
void discoverComponents(const CDT & ct, const SeedList& seeds) { if (ct.dimension() != 2) return; // tag all faces inside for(typename CDT::All_faces_iterator fit = ct.all_faces_begin(); fit != ct.all_faces_end(); ++fit) fit->set_in_domain(true); // mark "outside" infinite component of the object discoverInfiniteComponent(ct); // mark "outside" components with a seed for(typename SeedList::const_iterator sit = seeds.begin(); sit != seeds.end(); ++sit) { typename CDT::Face_handle fh_loc = ct.locate(*sit); if(fh_loc == NULL || !fh_loc->is_in_domain()) continue; std::list<typename CDT::Face_handle> queue; queue.push_back(fh_loc); while(!queue.empty()) { typename CDT::Face_handle f = queue.front(); queue.pop_front(); f->set_in_domain(false); for(int i = 0; i < 3; ++i) { typename CDT::Face_handle ni = f->neighbor(i); if(ni->is_in_domain() && !ct.is_constrained(typename CDT::Edge(f,i))) //same component { queue.push_back(ni); } } } } }
int main( ) { CDT cdt; std::cout << "Inserting a grid of 5x5 constraints " << std::endl; for (int i = 1; i < 6; ++i) cdt.insert_constraint( Point(0,i), Point(6,i)); for (int j = 1; j < 6; ++j) cdt.insert_constraint( Point(j,0), Point(j,6)); assert(cdt.is_valid()); int count = 0; for (CDT::Finite_edges_iterator eit = cdt.finite_edges_begin(); eit != cdt.finite_edges_end(); ++eit) if (cdt.is_constrained(*eit)) ++count; std::cout << "The number of resulting constrained edges is "; std::cout << count << std::endl; return 0; }
void discoverInfiniteComponent(const CDT & ct) { //when this function is called, all faces are set "in_domain" Face_handle start = ct.infinite_face(); std::list<Face_handle> queue; queue.push_back(start); while(! queue.empty()) { Face_handle fh = queue.front(); queue.pop_front(); fh->set_in_domain(false); for(int i = 0; i < 3; i++) { Face_handle fi = fh->neighbor(i); if(fi->is_in_domain() && !ct.is_constrained(CDT::Edge(fh,i))) queue.push_back(fi); } } }