【问题标题】:How to determine if a Delaunay triangle is internal or external?如何确定德劳内三角形是内部三角形还是外部三角形?
【发布时间】:2009-06-15 15:03:23
【问题描述】:

我正在编写一个程序,该程序需要实现中轴提取,其中 Delaunay 三角剖分是其中的一个步骤。外部中轴是不需要的,因此打算移除相应的外部三角形。幸运的是,我遇到了a page,里面有很多图表,也暗示了确定内部和外部德劳内三角形的方法(“基于折线周长”),但这只是一个提示,没有详细解释。有人知道算法吗?

编辑:我忘了提到初始点是从封闭多边形的边界采样的,我的目的是确定每个德劳内三角形是否在多边形内。

【问题讨论】:

  • 你的意思是点在多边形的周长上,还是点在多边形的边界上(但不一定在)?无论哪种方式,您现在不会遇到三角形可能与多边形边界重叠的问题(使其既是内部的又是外部的)?忽略这种情况(现在),假设我们已经对多边形进行了梯形分解,我们可以使用点位置在 O(tnlogn) 中找到完全内部和完全外部的三角形。检查重叠将导致天真的方法的运行时间为 O(tn)。不过可能有更好的方法。

标签: algorithm geometry computational-geometry medial-axis


【解决方案1】:

此解决方案假定您有一个数据结构,它使用“虚拟无限 Delaunay 顶点”来表示 Delaunay 三角剖分,就像 CGAL 所做的那样 (see details here)。

这个想法是找到边界Delaunay边缘:连接两个连续样本点的边缘;然后通过 Delaunay 三角剖分“泛洪”对 Delaunay 面进行分类。知道无限顶点是外部的,因此只要不跨越边界边,就可以将其邻居(以及邻居的邻居等)分类为外部。如果到达边界边缘,则可以简单地将相邻三角形标记为内部并以类似方式继续。

输入:对封闭形状的边界进行密集采样的点集,甚至可以包含孔
输出:形状内部的 Voronoi 图(形状中轴的近似值)

  1. 计算点的 Delaunay 三角剖分
  2. 标记连接两个连续采样点的 Delaunay 边。 (请参阅 page 4-5 of this paper 如何通过在每个 Delaunay 边缘上进行本地测试来做到这一点)
  3. 将所有无限的 Delaunay 面分类为 OUTSIDE 并将它们推送到队列 Q
  4. Q 不为空
    1. Delaunay face f = Pop from Q
    2. 对于 f 的每个未分类的相邻三角形 t
      • 如果标记了 tf 共享的 Delaunay 边, 将 t 归类为 f 的对立面
      • else 分类 tf 一样
      • t 推到 Q
  5. 对于每个 Delaunay 边 e
    • 如果相邻的两个德劳内三角形d1d2都属于INTERIOR,则输出连接d1d2.

对于这样的输入

可以计算以下中轴近似值:

您可以使用Mesecina 的免费 Windows 二进制文件查看此中轴近似在实践中的表现。源码here.

【讨论】:

  • 论文的旧链接
【解决方案2】:

您是否考虑过使用不创建外部三角形的不同形式的三角测量?我曾经参加过一门课程,花了很多时间讨论多边形三角剖分的理论方面。也许浏览课程网站会给您一些见解? http://cgm.cs.mcgill.ca/~godfried/teaching/cg-web.html#triangulation

编辑:实际上,我只是想到了别的东西。如果您已经有要尝试三角剖分的多边形,则可以使用格林定理。格林定理使用多边形的周长来计算其面积!更重要的是,在这种情况下,您可以通过查看面积符号来确定一个点是在一条线的一侧还是另一侧。在多边形上,格林定理解决了一个简单的减法问题。因此,取任何你知道在多边形内的点,并计算多边形每条边的面积。这会告诉您您的点需要位于每条线的哪一侧。现在只需在每个三角形内取一个点并做同样的事情。如果任何一个符号是错误的,那么你就有一个外部三角形。 (注意:根据多边形的形状,这实际上可能不起作用。它应该适用于凸多边形,但凹面可能会带来额外的复杂性。)

【讨论】:

    【解决方案3】:

    也许我在这里做了太多假设,但听起来你有一个由一堆点组成的多边形,并且你正在对这些点进行三角剖分。然后你想丢弃所有落在多边形之外的三角形,对吧?

    为什么不直接对多边形进行三角剖分(使用单调分解或类似的方法),这样您就不会创建任何外部三角形?我想这可能会增加运行时间(首先在 O(nlogn) 时间内进行三角剖分,然后在 O(n^2) 时间内创建 delaunay 三角剖分),但可能有更快的方法。

    【讨论】:

      【解决方案4】:

      他们提出的算法看起来有点损坏,正如他们在其中一张图中所显示的那样,这可能是 Google Scholar 中似乎没有任何有用引用的原因。

      Using their proposed algorithm on a non-convex polygon shows that it does not always recover an actual triangulation. http://www.cc.kyoto-su.ac.jp/~atsushi/Jun/Topics/Teddy/images/example2_2.jpg

      【讨论】:

        猜你喜欢
        • 2021-08-24
        • 2015-08-29
        • 2019-03-11
        • 2014-03-24
        • 2013-01-22
        • 1970-01-01
        • 2012-05-06
        • 2018-10-14
        • 1970-01-01
        相关资源
        最近更新 更多