我需要从一组点创建一个三角形网格。该集合具有非常少的点,因此不需要快速或优化(我将最多处理100个点)。网格需要是受约束的“delaunay三角剖分”。在下面的图像中,我显示了(在左侧)我开始的点集(蓝色和红色点)。我也知道这些点之间的联系(黑色轮廓)。网格需要看起来像右边的示例(包括形成外部和内部三角形的灰色边缘)。
我不能使用库。
我看了很多不同的算法。它们很多,很容易混淆。我想知道是否有一个天真的,因此希望更简单的算法,我可以用来生成右边的网格?蛮力方法很好(ps:我可以做Delaunay三角测量)。
感谢所有的答案。
我经历了为这个问题开发解决方案的过程,所以我想我会分享自己的经验,希望面对问题的人会发现洞察力很有用。
因此,根据我自己实施算法的经验,我得出结论:
总之:
所以无论如何斯隆工作。一个小图像,以说明答案,使其更具吸引力;-)
这是生产代码所以helas我无法分享...我可以引导我被解雇。但这个过程非常简单。您可以查找段(约束)与模型中所有边之间的交集。然后,对于每个相交的边,交换此边所属的2个三角形之间的对角线。如果新对角线仍与该段相交,则将新对角线添加回该段的相交边缘堆栈。如果新对角线不与段相交,则将其添加到新创建的边的堆栈中。继续处理相交边的堆栈,直到它为空。
然后,一旦完成,您需要处理新添加边的列表。对于它们中的每一个,检查Delaunay三角测量标准是否得到遵守。如果不交换此边缘所属的三角形的对角线。简单......
这只是论文......
26.9375 10.6875
32.75 9.96875
31.375 4.875
27.6562 2.0625
23.9375 -0.75
18.1562 -0.75
10.875 -0.75
6.60938 3.73438
2.34375 8.21875
2.34375 16.3125
2.34375 24.6875
6.65627 29.3125
10.9688 33.9375
17.8438 33.9375
24.5 33.9375
28.7188 29.4062
32.9375 24.875
32.9375 16.6562
32.9375 16.1562
32.9062 15.1562
8.15625 15.1562
8.46875 9.6875
11.25 6.78125
14.0312 3.875
18.1875 3.875
21.2812 3.875
23.4687 5.5
25.6562 7.125
8.46875 19.7812
27 19.7812
26.625 23.9688
24.875 26.0625
22.1875 29.3125
17.9062 29.3125
14.0312 29.3125
11.3906 26.7188
8.75 24.125
这些是x / y / z坐标(z = 0)
段:
0 1
1 3
3 5
5 7
7 9
9 11
11 13
13 15
15 17
17 19
19 20
20 22
22 24
24 26
26 0
28 29
29 31
31 33
33 35
35 28
指数从0开始(0 - >顶点列表中的第一个顶点)
我尝试使用alpha形状,对于一些形状https://concavehull.codeplex.com/有良好的效果,但它远不及原始约束delaunay三角测量。
这是我的alpha形状算法:https://alphashape.codeplex.com。
一个简单的方法似乎是实现ear clipping算法。没有哈希网格或quad trees中的优化。对于耳朵剪辑,您只需检查每三个连续顶点a,b和c。如果b是凸的并且多边形的其他顶点不在三角形abc内,则可以剪切此三角形,将多边形的边界减少一个顶点,b。
此外,你必须存储邻里关系。因此,从每个三角形引用其最多三个邻居。
三角测量完成后,将其转换为受约束的Delaunay三角剖分(CDT)。这可以通过edge flipping完成。因此,你必须检查每个三角形的外接圆。如果相邻三角形的顶点不在三角形内,则符合CDT,否则翻转发生违规的三角形边缘。
由于@Betterdev在注释中编辑打击:可以通过添加桥来将输入多边形中的可能孔添加到初始边界。作为预处理,可以通过“双”边缘将孔的顶点连接到边界的顶点。这总是可行的,并使每个孔成为主多边形边界的一部分;适用于耳朵剪裁。然而,通过这些桥梁存储邻居对于翻转是至关重要的。