如何识别CGAL约束Delaunay三角化中的孔洞所属面?
识别CGAL三角化网格中属于孔洞的面
问题背景
使用CGAL对带孔洞的多边形进行三角化时,库会同时对孔洞区域生成网格,但需要在绘制时排除这些孔洞面,目前无法找到有效的识别方法。
现有尝试与问题
曾尝试通过面的is_marked()方法识别,但将孔洞作为种子添加后,所有有限面都被标记,无法区分孔洞区域。
使用的核心代码:
std::list<Point> seeds; CGAL::Delaunay_mesher_2 mesh(cdt); mesh.set_criteria(Criteria(0.125, 20)); mesh.set_seeds(seeds.begin(), seeds.end()); mesh.refine_mesh(); CGAL::lloyd_optimize_mesh_2(cdt, CGAL::parameters::max_iteration_number = 10);
遍历代码:
for(CDT::Finite_faces_iterator fit = cdt.finite_faces_begin(), end = cdt.finite_faces_end(); fit != end; ++fit) { // 检查fit->is_marked(),但所有面均为标记状态 }
解决方案
利用原始带孔洞多边形的点位置判断功能,通过面的重心是否位于多边形有效区域内,来区分是否为孔洞面:
- 确保已正确构建
Polygon_with_holes_2对象(即你的带孔洞原始多边形)。 - 遍历每个有限面时,计算面的重心。
- 使用
Polygon_with_holes_2::bounded_side()方法判断重心位置:- 返回
CGAL::ON_BOUNDED_SIDE:面位于多边形有效区域(非孔洞),需要保留绘制; - 返回其他值:面位于孔洞或外部区域,排除绘制。
- 返回
示例代码:
#include <CGAL/centroid.h> // 假设polygon是你的带孔洞多边形对象 Polygon_with_holes_2 polygon = ...; for(CDT::Finite_faces_iterator fit = cdt.finite_faces_begin(), end = cdt.finite_faces_end(); fit != end; ++fit) { // 计算当前面的重心 Point face_center = CGAL::centroid(fit->triangle()); // 判断重心是否在多边形有效区域内 CGAL::Bounded_side side = polygon.bounded_side(face_center); if (side == CGAL::ON_BOUNDED_SIDE) { // 执行绘制操作 draw_face(fit); } // 否则跳过孔洞/外部区域的面 }
补充说明
is_marked()方法的设计用途是网格细化标记,而非区域区分,因此无法用来识别孔洞面。- 若需要处理边界面,可根据需求额外判断
CGAL::ON_BOUNDARY状态,决定是否绘制。
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

