You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何识别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(),但所有面均为标记状态
}

解决方案

利用原始带孔洞多边形的点位置判断功能,通过面的重心是否位于多边形有效区域内,来区分是否为孔洞面:

  1. 确保已正确构建Polygon_with_holes_2对象(即你的带孔洞原始多边形)。
  2. 遍历每个有限面时,计算面的重心。
  3. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 04:52:03