Created
March 14, 2022 11:45
-
-
Save afabri/82e9680181eea814fb488f96ceca8c12 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h> | |
#include <CGAL/Constrained_Delaunay_triangulation_2.h> | |
#include <CGAL/Triangulation_face_base_with_info_2.h> | |
#include <CGAL/Delaunay_mesh_face_base_2.h> | |
#include <CGAL/Polygon_2.h> | |
#include <CGAL/IO/write_VTU.h> | |
#include <iostream> | |
struct FaceInfo2 | |
{ | |
FaceInfo2(){} | |
int nesting_level; | |
bool in_domain(){ | |
return nesting_level%2 == 1; | |
} | |
}; | |
typedef CGAL::Exact_predicates_inexact_constructions_kernel K; | |
typedef CGAL::Triangulation_vertex_base_2<K> Vb; | |
typedef CGAL::Triangulation_face_base_with_info_2<FaceInfo2,K> Fbb; | |
typedef CGAL::Constrained_triangulation_face_base_2<K,Fbb> CFb; | |
typedef CGAL::Delaunay_mesh_face_base_2<K,CFb> Fb; | |
typedef CGAL::Triangulation_data_structure_2<Vb,Fb> TDS; | |
typedef CGAL::Exact_predicates_tag Itag; | |
typedef CGAL::Constrained_Delaunay_triangulation_2<K, TDS, Itag> CDT; | |
typedef CDT::Point Point; | |
typedef CGAL::Polygon_2<K> Polygon_2; | |
typedef CDT::Face_handle Face_handle; | |
void | |
mark_domains(CDT& ct, | |
Face_handle start, | |
int index, | |
std::list<CDT::Edge>& border ) | |
{ | |
if(start->info().nesting_level != -1){ | |
return; | |
} | |
std::list<Face_handle> queue; | |
queue.push_back(start); | |
while(! queue.empty()){ | |
Face_handle fh = queue.front(); | |
queue.pop_front(); | |
if(fh->info().nesting_level == -1){ | |
fh->info().nesting_level = index; | |
if(fh->info().in_domain()){ | |
fh->set_in_domain(true); | |
} | |
for(int i = 0; i < 3; i++){ | |
CDT::Edge e(fh,i); | |
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); | |
} | |
} | |
} | |
} | |
} | |
//explore set of facets connected with non constrained edges, | |
//and attribute to each such set a nesting level. | |
//We start from facets incident to the infinite vertex, with a nesting | |
//level of 0. Then we recursively consider the non-explored facets incident | |
//to constrained edges bounding the former set and increase the nesting level by 1. | |
//Facets in the domain are those with an odd nesting level. | |
void | |
mark_domains(CDT& cdt) | |
{ | |
for(CDT::Face_handle f : cdt.all_face_handles()){ | |
f->info().nesting_level = -1; | |
f->set_in_domain(false); | |
} | |
std::list<CDT::Edge> border; | |
mark_domains(cdt, cdt.infinite_face(), 0, border); | |
while(! border.empty()){ | |
CDT::Edge e = border.front(); | |
border.pop_front(); | |
Face_handle n = e.first->neighbor(e.second); | |
if(n->info().nesting_level == -1){ | |
mark_domains(cdt, n, e.first->info().nesting_level+1, border); | |
} | |
} | |
} | |
int main( ) | |
{ | |
//construct two non-intersecting nested polygons | |
Polygon_2 polygon1; | |
polygon1.push_back(Point(0,0)); | |
polygon1.push_back(Point(2,0)); | |
polygon1.push_back(Point(2,2)); | |
polygon1.push_back(Point(0,2)); | |
Polygon_2 polygon2; | |
polygon2.push_back(Point(0.5,0.5)); | |
polygon2.push_back(Point(1.5,0.5)); | |
polygon2.push_back(Point(1.5,1.5)); | |
polygon2.push_back(Point(0.5,1.5)); | |
//Insert the polygons into a constrained triangulation | |
CDT cdt; | |
cdt.insert_constraint(polygon1.vertices_begin(), polygon1.vertices_end(), true); | |
cdt.insert_constraint(polygon2.vertices_begin(), polygon2.vertices_end(), true); | |
//Mark facets that are inside the domain bounded by the polygon | |
mark_domains(cdt); | |
int count=0; | |
for (Face_handle f : cdt.finite_face_handles()) | |
{ | |
if ( f->info().in_domain() ) ++count; | |
} | |
std::cout << "There are " << count << " facets in the domain." << std::endl; | |
std::ofstream output("intersected_mesh.vtu"); | |
CGAL::write_vtu(output, cdt); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment