CGAL 简单的多边形

该文介绍了如何利用CGAL库中的Constrained_Delaunay_triangulation_2类将一个非简单的2D多边形拆分为简单的多边形。通过创建一个约束Delaunay三角剖分,可以将给定的点集(多边形边界)转化为一系列三角形,从而达到分割目的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设我有一个非简单的多边形, CGAL如何帮助我将其划分为一组简单的多边形?

例如,给出由一系列2D点表示的多边形:

(1, 1) (1, -1) (-1, 1) (-1, -1) 

我希望获得两个多边形;

(1, 1) (1, -1) (0, 0)

(0, 0) (-1, 1) (-1, -1) 

CGAL是否可行?

1 个答案:
答案 0 :(得分:0)

您需要的两个多边形不构成原始船体。如果您只想使用(0,0)作为顶点之一将原始集合分成三角形,则可以执行此操作:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Constrained_Delaunay_triangulation_2.h>
#include <CGAL/Delaunay_mesh_vertex_base_2.h>
#include <CGAL/Delaunay_mesh_face_base_2.h>
#include <vector>    

typedef CGAL::Exact_predicates_inexact_constructions_kernel     K;
typedef K::Point_2                                              Point_2;
typedef CGAL::Delaunay_mesh_vertex_base_2<K>                    Vb;
typedef CGAL::Delaunay_mesh_face_base_2<K>                      Fb;
typedef CGAL::Triangulation_data_structure_2<Vb, Fb>            Tds;
typedef CGAL::Constrained_Delaunay_triangulation_2<K, Tds>      CDT;
typedef CDT::Vertex_handle                                      Vertex_handle;
typedef CDT::Face_iterator                                      Face_iterator;    

int main(int argc, char* argv[])
{
    // Create a vector of the points
    //
    std::vector<Point_2> points2D ;
    points2D.push_back(Point_2(  1,  1));
    points2D.push_back(Point_2(  1, -1));
    points2D.push_back(Point_2( -1,  1));
    points2D.push_back(Point_2( -1, -1));
    points2D.push_back(Point_2( 0, 0));

    size_t numTestPoints = points2D.size();

    // Create a constrained delaunay triangulation and add the points
    //
    CDT cdt;
    std::vector<Vertex_handle> vhs;
    for (unsigned int i=0; i<numTestPoints; ++i){
        vhs.push_back(cdt.insert(points2D[i]));
    }

    int i=0;
    for (Face_iterator fit = cdt.faces_begin()  ; fit != cdt.faces_end(); ++fit) {
        printf("Face %d is (%f,%f) -- (%f,%f) -- (%f,%f) \n",i++,
               fit->vertex(0)->point().x(),fit->vertex(0)->point().y(),
               fit->vertex(1)->point().x(),fit->vertex(1)->point().y(),
               fit->vertex(2)->point().x(),fit->vertex(2)->point().y() );

    }

    return 0 ;
}

哪个应该给你这样的输出:

Face 0 is (0.000000,0.000000) -- (1.000000,-1.000000) -- (1.000000,1.000000) 
Face 1 is (0.000000,0.000000) -- (1.000000,1.000000) -- (-1.000000,1.000000) 
Face 2 is (-1.000000,-1.000000) -- (0.000000,0.000000) -- (-1.000000,1.000000) 
Face 3 is (-1.000000,-1.000000) -- (1.000000,-1.000000) -- (0.000000,0.000000) 
CGAL (Computational Geometry Algorithms Library) 是一个开源的计算机辅助几何处理软件库,它提供了丰富的几何算法,包括对多边形的操作。要实现封闭多边形的缩放,你可以按照以下步骤在CGAL中操作: 1. **加载必要的模块**:首先,需要包含`CGAL::Polygon_2<Kernel>`模块,其中`Kernel`是一个几何运算的抽象层。 ```cpp #include <CGAL/Polygon_2.h> #include <CGAL/Exact_predicates_inexact_constructions_kernel.h> // 使用精确几何 ``` 2. **创建多边形**:创建一个`Polygon_2`对象,并提供多边形顶点的坐标,表示初始大小的多边形。 ```cpp CGAL::Polygon_2<Kernel> polygon; // 假设顶点存储在一个向量中 std::vector<Point_2> vertices = ...; // 闭合路径的顶点集合 polygon = CGAL::Polygon_2<Kernel>(vertices.begin(), vertices.end()); ``` 3. **定义缩放因子**:确定一个缩放因子,比如0.5,这将把多边形缩小到原来的一半。 4. **应用缩放**:使用`scale()`函数,传入缩放因子以及多边形的一个点作为参照点(通常是原点 `(0, 0)`),对多边形进行缩放。 ```cpp double scale_factor = 0.5; Point_2 origin(0, 0); CGAL::scale(polygon, scale_factor, origin); ``` 5. **验证结果**:最后检查缩放后的多边形是否按预期改变大小。 注意:这个过程假定你在使用CGAL的精确几何模式(`Exact_predicates_inexact_constructions_kernel`)。如果需要浮点精度,则可能会有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lst0426

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值