Delaunay 三角化 --实现策略

Delaunay 三角化

Delaunay 三角化(三角刨分)
Delaunay 三角化所有外接圆显示

我们看这两种图,能得到什么结论呢?

结论
【在所有的点集中,任意点都不在任何的三角外接圆内 --即点集中的任何一点与任意一个三角的外接圆的距离都不小于此外接圆的半径】
定义性质
三角形的任何顶点都不在任何三角形外接圆盘的内部----唯一的圆盘,其边界接触到三角形的三个顶点

在三维空间中,任何顶点都不会被任何四面体的外接球体包围。 Delaunay 三角剖
分优化了几个有价值的几何准则,包括一些与插值精度有关的准则。

那具体怎么实现呢?

1、起始思想与计算方法

起始思想

 最开始是一个叫Boris Delaunay的俄罗斯数学家,他在1934 年发明了现在称为Delaunay三角剖分的规则体,是现代数学晶体学和晶体的一般数学模型1

Delaunay 三角化的计算方法
Bowyer-Watson算法
  1. 假定已生成了连接若干个顶点的 Delaunay 三角网格;
  2. 加入一个新的节点,找出所有外接圆包含新加入节点的三角形,并
    将这些三角形删除,形成一个空腔;
  3. 空腔的节点与新加入的节点连接,形成新的 Delaunay 三角形网格;
  4. 调整数据结构,新生成的三角形的数据填充被删除三角形的数
    据,余者添加在数组的尾部;2

在第2步的方法中不同人有不同的实现策略


2、理解算法与实现策略

  根据以上阐述

a、首先我们需要一个随机点集

 那么我们就定义一个100*100 的矩形地图范围,在其中生成任意或指定个的随机位置点,我这里为了方便演示我会设计成可指定随机点个数的(其位置肯定照常随机)。

 为了方便先根据地图范围将其轮廓显示出来(我这里用网格显示出来了便于之后观看)

  • 这里先随机生成0个地图点(进行初步理解)
    在这里插入图片描述
    之后就开始将其开始三角化

Delaunay 三角化 最大化了此三角剖分中三角形的最小角,换句话,此算法尽量避免出现“极瘦”的三角形3

b、定义一个包含所有地图点(即整个地图)的超级三角形

在这里插入图片描述

c、实现之前的定义与性质内容
超级三角
超级三角的外接圆
依次检查A、B、C是否满足定义
【进行步骤】
  1. 将地图点按任意方向轴排序例如按x轴
  2. 我们依次检查A、B、C三点与所有三角的外接圆心之间的距离,因为此时的三角只有一个所以比较简单
  • 这里有个注意点就是判断的精度问题,在比较与外接圆心之间的距离时可能会出现,所以通常要定义号合适的精度数(精确到小数点后几位)
  1. A点不小于外接圆直径,所以不生成新的三角,B、C一致。
  2. 此三角经受住了定义的考验所以被留了下来,此刻到了最后所有的地图点都比较完成,剩余的三角只有一个所以该图的三角化,就是这个超级三角。
  • 这里有几个问题( 我们会在 【d 标题】讨论。)
    • 地图点为什么要排序?
    • 为什么要生成的新三角?
    • 生成的新三角是什么?
    • 新三角们的生成是否还需要与当前不满足定义的点比较呢?
d、正式生成地图点
  • 在地图中随机生成一点D,在加上超级三角的三个点A,B,C
    在这里插入图片描述
解决问题
  1. 生成的新三角是什么?
    看下图,D点在与超级三角(A,B,C)的外接圆半径比较时很明显其与圆心距离是小于外接圆半径的,所以要生成的新三角。点D需要根据此三角的三点(A,B,C)生成新的三个三角形.[D,A,B] [D,B,C] [D,C,A]
    在这里插入图片描述
  2. 为什么要生成的新三角?
    在地图点进行遍历时,D点并不满足在[A,B,C]三角中的规则,所以此三角要被删除不在使用。正因为此三角不适合D点定义的满足所以要找到在[A,B,C]范围内中适合的三角,因此D点将[A,B,C]进行分割,恰好其分割的三角们是正好满足定义的,也包括之前所遍历过的点(将原先三角进行细分其整体还是原先的三角啊)
  3. 地图点为什么要排序?
    排序是因为要将所有的地图点集与三角外接圆所比较,并会生成新的三角,所以在生成新三角后如果遍历的地图点越少的话之后的地图点将会面临更多的三角比较,增加更多不必要的运算与性能消耗与时间消耗,所以要将三角数量从低到高开始增加
  4. 新三角们的生成是否还需要与当前不满足定义的点比较呢?
    D点将[A,B,C]进行分割,恰好其分割的三角们是正好满足定义,D点处于新生成的三个三角的公共点上,其正好处于三个外接圆的交点上,所以已经满足定义了并不需要在进行比较
    在这里插入图片描述
进行步骤

在这里插入图片描述

  1. 将地图点按任意方向轴排序例如按x轴
A
B
D
C
  1. 我们依次检查A、B、D、C三点与所有三角的外接圆心之间的距离,因为此时的三角(A,B,C)只有一个所以比较简单
  2. A点不小于(A,B,C)外接圆直径,所以不生成新的三角(否则用该三角细分三角,并删除该三角),B一致。
  3. D点小于(A,B,C)外接圆直径,所以删除三角(A,B,C),并生成新的三个三角[D,A,B] [D,B,C] [D,C,A]
    在这里插入图片描述
  4. 轮到C点比较了,这时C点就需要依次与所有未被删除的三角([D,A,B] [D,B,C] [D,C,A])进行比较,当然其也都满足定义(不满足再到【3】)
  5. 剩余未被删除的三角经受住了定义的考验所以被留了下来,此刻到了最后所有的地图点都比较完成,剩余的三角([D,A,B] [D,B,C] [D,C,A]),即为三角化成果
  6. 还需要注意一种情况,在【4】之后的下一点如果不满足呢?例如E点
    在这里插入图片描述
  7. 点E在与([D,A,B] [D,B,C] [D,C,A])三角依次比较时在[D,B,C]时就不满足定义,那我们按原先的及策略对E在[D,B,C]中进行细分([E,D,B],[E,B,C],[E,C,D]),并将[D,B,C]删除
    在这里插入图片描述
  8. 在这里我们还需要考虑一种进阶情况,例如将E点向左移动到(D,A,B)的外接圆内并且其还在(D,B,C)中(即在多个外接圆内)。这种情况会出现线交叉,例如[D,B][A,E]如图所示。
    那么我们就要进行剪枝 :找出E点的所有不满足定义的三角([D,A,B],[D,B,C])之间的所有公共边([D,B])。
    之后先前由([D,A,B],[D,B,C])细分的三角们凡是与刚刚找出的公共边们由着相同边的三角就将其删除(如图的(E,D,B)三角)
最终图
  1. 之后到【5】步
策略执行过程,慢放

  1. https://en.wikipedia.org/wiki/Boris_Delaunay#cite_ref-4 ↩︎

  2. 基于Bowyer-Watson三角网生成算法的研究 1002-8331(2013)06-0198-03 ↩︎

  3. https://en.wikipedia.org/wiki/Delaunay_triangulation ↩︎

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值