给定一组边界点的二维三角剖分

2d triangulation given a set of boundary points

假设我有一张二值图像,我检测了边界像素。根据边界像素,我想做如下所示的三角剖分。

我应该为这个算法查找的关键字是什么?我查找了 Delaunay 三角剖分,但根据我的理解,我还需要内部点才能使其正常工作。

此图来源于this paper。他们称此为 "adaptive triangular mesh" 并声称使用 CGAL 生成它,但我用谷歌搜索 "adaptive triangular mesh" 并查看了所有 CGAL 的文档,但找不到任何相关内容。有人可以给我指出正确的方向吗?

我认为您正在寻找的是受约束的 Delaunay 三角剖分 (CDT),但您可能还会看到它被称为 Conforming Delaunay 三角剖分(它是 "conforming constrained..." 的缩写) .我在 https://github.com/gwlucastrig/Tinfour/wiki/About-the-Constrained-Delaunay-Triangulation . The polygon you specify would serve as a constraint on the overall placement of edges in the Delaunay. There is also some more information on the kind of thing you're trying to do at https://github.com/gwlucastrig/Tinfour/wiki/Tutorial-Using-Polygon-Based-Constraints 上发布了描述 CDT 的页面。第二篇文章作为想法的来源可能很有用,但其中的一些讨论与特定的 API.

有关

您发布的图像中的多边形似乎是凸的。 Delaunay 的边界是凸的。因此,如果您的多边形是凸面的,则不会在多边形之外放置任何边。但是,如果您的多边形包含一些凹面,那么多边形之外就会有边。 Delaunay API 的任何体面的实现都将允许您的代码区分边是否在约束内。

您发布的图片似乎经过了某种 Delaunay 细化,在该过程中将顶点插入网格以创建更稳固的三角形。您会注意到图片中没有 "skinny" 个三角形,并且在边界附近有很多小三角形。这些特征是精修技术的典型特征。如果您使用不包含细化方法的 API,您仍然会得到一个有效的 Delaunay,但它在审美意义上可能不太令人满意。代替细化实现,您可以简单地让您的代码查找细小的三角形并将它们的外接圆中心插入到网格中。

好吧,我首先要指出符合要求的 CDT 已经是 Delaunay。细化算法只是改进了三角形的一般形状。当网格用于某些数值计算时,细化具有优势。但这并不是每个应用程序都绝对需要的。例如,我使用非细化网格计算湖泊和水库的体积和表面积,效果很好(参见 https://github.com/gwlucastrig/Tinfour/wiki/Using-the-Delaunay-to-Compute-Lake-Volume-Part-1)。

Delaunay Refinement 有两种主要算法:Ruppert 和 Chew 的第二算法。两者都通过在有利位置将人工点插入网格来进行操作。 Ruppert 是两者中较老的一个,并保证所有三角形都满足 Delaunay 标准。 Chew's 产生了更好的三角形,但我认为,不能保证 Delaunay。

我在 http://2011.cccg.ca/PDFschedule/papers/paper91.pdf 上找到了一篇关于 Chew 算法的文章,图 6 很好地直观地说明了细化的作用。

我计划使用 Ruppert 算法在我自己的软件库中实施 Delaunay Refinement。有一些技术挑战让我放​​慢了速度。我相信,如果您寻找 Jonathan Shewchuk 真正优秀的 Triangle 程序包,或者 CGAL 库,或者 Java 拓扑套件 (https://locationtech.github.io/jts/),您会找到一些实现。