寻找包含点k的以点集P中的三个点为顶点的最小三角形

问题描述

通过Lawson算法实现 Delaunay 三角剖分中有这么一个步骤:

Computational Geometry Algoorithms and Applications 3ed.Springer:2008:200

就比如说,点集P内有五个点A、B、C、O、K,其中A、B、C、O已经组成四个三角形(ABC, ABO, BCO, CAO),怎么确定包含K的最小三角形AOC呢?

image.png

引用

以下内容翻译自Computational Geometry Algoorithms and Applications 3ed. Springer:2008:202-204,我英语水平让人捉急,勿怪,原文会放在最后。

我们使用和第六章用过的十分相似的一个方法寻找包含点 pr 的三角形:当我们构造Delaunay三角剖分的同时,也构造了一个点位置结构(point location structure) D ,它是一个有向无环图(DAG)。 D 的叶子结点相当于当前三角剖分 T 的三角形,并且保留这些叶子和三角剖分的交叉点。 D 的内部结点相当于三角化时早期创建的那些三角形,这些三角形现在早已被销毁了。点的位置结构的构造方法如下。在算法第三行,将 D 初始化为一个只有一个叶子结点的DAG,该叶子结点相当于三角形 p0p-1p-2

假使在某点,将三角剖分中的三角形 pipjpj 分成两个(或三个)新的三角形。这个过程相当于往 D 中新增了两个(或三个)新的叶子结点,并使 pipjpk 对应的叶子结点成为带有向外的指针的内部结点,指向两个(或三个)叶子结点。同样地,通过边交换(edge flip)把三角形 pkpipl
pkplpj 变成 pkpipj 和 pipjpl,也创建了两个新的三角形对应的叶子结点。图9.9展示了 D 中新增一个点时的变化。注意:当使一个叶子结点称为内部结点时,这个结点最多获得三个向外的指针。

图9.9 The effect of inserting point pr into triangle ∆1 on the data structure D (the part of D that does not change is omitted in the figure)

通过 D 能定位下一个要添加到三角剖分的点pr,如下。 D 的根结点root对应于最初的三角形 p0p-1p-2,从root出发,我们检查root的三个孩子,确定点 pr 在哪个三角形内,并继续往下到那个孩子(那个三角形对应的孩子)。继续检查该孩子的三个孩子,确定哪个孩子对应的三角形包含 pr ,然后一直这样下去,直到遇到 D 的叶子结点。叶子结点对应的三角形包含点pr。由于任一节点的出度(out-degree)最多为3,因此搜索路径上的节点数(或者说存储在 D 中的包含点pr的三角形的数目)花费线性的时间(不知道这句话翻译的是否准确)。

分析

书上讲的很清楚了,我先用大白话解释下其中的几点内容。

  1. 一个三角剖分的三角形 等价于 一个DAG图的结点,这可能是很多人一开始没读明白的。而这个DAG图是臆想出来的,构造它是为了借助它操作它对应的三角剖分。

  2. “早期”、“当前”:看第一张图,Lawson算法采用的是一种叫“随机增量”的方法,就是把点集中的点一个一个有先后顺序地加到 T 中,所以就有 “之前已经加入”,“当前正要加入”,“接下来将加入” 之类地说法。

  3. 用前面的图总结下这个过程(寻找点M所在的三角形),先忽略它是不是Delaunay三角剖分:已知M肯定在最大的三角形ABC(root)内,遍历它的三个孩子CAO,ABO,BCO,检查M在root的哪个孩子内。发现在CAO中,遍历CAO的三个孩子CAK,AOK,OCK,检查M在CAO的哪个孩子内。发现在OCK中,而OCK没有孩子,它就是个叶子了,得出结论:M在OCK中。

summary.png

再考虑一些细节。

  1. DAG图是需要完整存储的,否则没法通过父子关系依次寻找。
  2. 注意 flip 时并没有将两个原三角形对应的结点销毁,而是将两个新三角形对应的结点作为两个原结点共同的孩子。
  3. 未完待续...

以下是原文:

201-202
203-204

你可能感兴趣的:(寻找包含点k的以点集P中的三个点为顶点的最小三角形)