没有快速解决这个问题的方法。认为只需要50行代码就可以实现是不合理的。实际上,我编写的程序(C++)大约有400到500行(很难确定是否包括注释)。它既紧凑又具有挑战性,并且花费了我2到3天的时间来正确理解逻辑(这可能很棘手)。
我发现Sloan在“生成受限Delaunay三角剖分的快速算法”中提出的算法非常适合手头的问题。当涉及到Delaunay三角剖分时,对于我来说,这是一个新课题,似乎有很多不同的算法方法,而且这项研究相当古老。因此,对于新手来说,很难知道从哪里开始。
2.1 很难知道哪个算法是最近的,理解起来简单且快速简单实现。
2.2 一般来说,一旦你理解了原则,大多数情况下只需要以最有效的方式编写逻辑(似乎这就是大多数算法/论文所争取的)。
2.3 我发现Sloan的论文易于理解,非常清楚地解释了。如果您遵循逻辑和说明,则任何人都可以实现受限Delaunay三角剖分。
我推荐Sloan的论文,因为它包括如何创建Delaunay三角剖分,然后是必要的约束三角剖分的解释。
回答我的问题,实际上没有“蛮力”解决这个问题。实现这种技术只需要实现完整的逻辑,并且大多数实现可能需要更多或更少相同数量的工作。
有一个细微差别,即我并没有寻求太多优化,因为我的点集非常小。因此,我确信许多算法比Sloan描述的算法更好;它们可能提出了优化的数据结构和最小化步骤的算法,例如点插入三角剖分等。
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->顶点列表中的第一个顶点)