利用CGAL库函数细分约束三角剖分以及搜寻约束边界内的三角形面(CDT refinement in CGAL)

本文介绍了利用CGAL库进行约束三角剖分和细分的过程,以及如何寻找约束边界内的三角面。作者通过插入多边形、调用细分函数实现细分,并提出了在细分过程中遇到的问题,如无法正确处理边界约束和内部三角面搜索的效率问题,期望得到社区的帮助和讨论。
摘要由CSDN通过智能技术生成

最近自己要研究一个约束三角剖分的细分功能(对一个服装进行三角剖分、细分并且变形),搜了很久,找到一个比较对口的库——CGAL库。但是国内使用的人很少,资料也很少。所以自己还是处于最基本的摸索阶段。虽然自己也是属于一桶水连一瓢都木有的状态(跟不用说半桶水了orz...),不过还是经过反复试验,实现了自己所需要的功能(中间有一些小问题还尚未解决,写出来希望大牛们一起探讨这么可以解决)。

问题:如下图,提取服装的轮廓之后,对其进行约束三角剖分(轮廓作为约束边)并且细分。


提取的服装轮廓(用关键点的连线多边形表示)如下图:


将以上由关键点组成的polygon作为边界约束,进行三角剖分以及细化。为了方便,首先加入一些头文件并且定义一些CGAL数据(其实我也不是很懂这些参数的意义,反正看到CGAL用户手册上总是定义一堆数据,下面的这些定义都是差不多,我直接copy过来的。你们也照着抄吧,哈哈哈)。原版CGAL实例中定义CDT::Point Point,但是因为我的应用中还用到openCV,里面也有一个cv::Point,为了防止冲突我就改成了typedef CDT::Point CdtPoint. 

然后对以上的这些关键点组成的封闭多边形进行约束三角剖分(CDT: Constrained Delaunay Triangulation),所以先在主函数定义一个CDT cdt; 然后将这些点将入CDT中,并且每对相邻点是一个边约束。

主要用到的函数:

<span style="font-size:14px;">Vertex_handle insert(const Point& p, Face_handle start = Face_handle());
Constrained_triangulation_2<Gt,Tds,Itag>::insert_constraint(Vertex_handle  vaa, Vertex_handle vbb);</span>

我直接写了一个InsertPolygon()的函数:

<span style="font-size:14px;">void InsertPolygonInCDT(CDT& cdt, vector<CdtPoint> polygon)
{
	int s = polygon.size();
	for (int i=0; i<s; i++)
	{
		Vertex_handle v_pt = cdt.insert(polygon[i]);
		Vertex_handle v_pt2 = cdt.insert(polygon[(i+1)%s]);//依次插入两个相邻的关键点

		cdt.insert_constraint(v_pt, v_pt2);//将相邻点作为一个边约束插入CDT
	}
}</span>

接着,对cdt进行细分,用到的函数为:

<span style="font-size:14px;">CGAL::refine_Delaunay_mesh_2(CDT cdt, Criteria(0.125, min_len));</span>
其中Criteria指示的是细分度,第一个参数默认为0.125(具体含义看手册好像是和B有关的细分参数,其余我也不是很清楚,索性都直接写0.125好了),第二个参数表示细分中最大的边长长度
  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
CGAL是计算几何算法库的缩写,它提供了许多用于处理和操作几何数据结的算法和数据结。在CGAL中,3D三角剖分是一种用于将三维空间中的点集划分为三角形片的方法。根据引用中所述,CGAL的3D三角剖分基于四体结。每个四体包含四个顶点,其中一个顶点是一个辅助顶点,称为无限顶点,用于处理无界单元。通过这种方式,每个片对应两个四体,同时可以处理凸包边界上的特殊情况。请注意,无限顶点没有具体的坐标意义,也没有几何谓词可以应用于它。你可以在引用提供的链接中了解更多关于CGAL 3D三角剖分的详细信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [CGAL 二维三角剖分](https://blog.csdn.net/dayuhaitang1/article/details/128783294)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [CGAL 三维三角剖分](https://blog.csdn.net/dayuhaitang1/article/details/128881509)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值