DELAUNAY三角网的算法
Delaunay三角网建立的改进算法
0 引 言
2维 任 意域 内点 集 的 D l nyi角 剖 分 具 有 最 小 e ua a 角最 大 的 良好性 质 , 被公 认 为最 优 的 三角 剖 分 , 科 学 在
比较慢 。本文深入研究了算法的实现步骤, 对其 中的关 键环节加 以优化和改进 , 高了算法 的执行 效率 , 提 使算
中图分类号 :2 l P 2
文献标识码 : B
文章编号 :62— 87 20 ) l 0 3 — 4 17 5 6 (07 0 一 0 8 0
An I pr v d Al o ih o e to fDe a n y Tra g l to m o e g rt m f r Cr a i n o l u a i n u a i n
维普资讯
第3 0卷 第 1 期
2 0 年 2 月 07
测 绘 与 空 间地 理 信 息
GEOM AT CS & SPAT AL l oRM A oN ECHNOL GY I I NF Tl T O
Vo . 0, .1 1 3 No
F b ,2 0 e. 07
响算法效率的关键环节 , 并采用数据点 集分块 管理 、 三角形快速 定位 、 变点插入 顺序等 方法进行 了算 法优 化 , 改
对三角形快速定位方法进行 了改进 。测试 实验的结果说 明 , 法改进后 D l ny 算 e ua 三角 网建立的效率提 高了 4~ a 6
倍。
关 键 词 : e ua 三 角 网: 点 插 入 法 : 角 形快 速 定 位 D l ny a 逐 三
1 求 出点集 中 ) Y和 — Y的最大值 和最小值 , 并
将 对 应 的 4 点 按逆 时 针方 向组 成 一 个链 表 , 成 初 始 个 构
delaunay三角网生长准则及算法
Delaunay 三角网是Voronoi(或称thiessen多边形,V 图)图的伴生图形◆Delaunay 三角网的定义:由一系列相连的但不重叠的三角形的集合, 而且这些三角形的外接圆不包含这个面域的其他任何点。
◆Voronoi图的定义:Voronoi图把平面分成N 个区,每一个区包括一个点,该点所在的区域是距离该点最近的点的集合。
◆Delaunay三角网的特性:◆不存在四点共圆;◆每个三角形对应于一个Voronoi图顶点;◆每个三角形边对应于一个Voronoi图边;◆每个结点对应于一个Voronoi图区域;◆Delaunay图的边界是一个凸壳;◆三角网中三角形的最小角最大。
空外接圆准则最大最小角准则最短距离和准则在TIN中,过每个三角形的外接圆均不包含点集的其余任何点在TIN中的两相邻三角形形成的凸四边形中,这两三角形中的最小内角一定大于交换凸四边形对角线后所形成的两三角形的最小内角一点到基边的两端的距离和为最小Delaunay三角剖分的重要的准则张角最大准则面积比准则对角线准则一点到基边的张角为最大三角形内切圆面积与三角形面积或三角形面积与周长平方之比最小两三角形组成的凸四边形的两条对角线之比。
这一准则的比值限定值,须给定,即当计算值超过限定值才进行优化Delaunay三角剖分的重要的准则不规则三角网(TIN)的建立●三角网生长算法就是从一个“源”开始,逐步形成覆盖整个数据区域的三角网。
●从生长过程角度,三角网生长算法分为收缩生长算法和扩张生长算法两类。
方法说明方法实例收缩生长算法先形成整个数据域的数据边界(凸壳),并以此作为源头,逐步缩小以形成整个三角网分割合并算法逐点插入算法扩张生长算法从一个三角形开始向外层层扩展,形成覆盖整个区域的三角网递归生长算法逐点插入算法分割合并算法12121212递归生长算法333TIN 建立过程中的几个问题:◆邵春丽.DELAUNAY 三角网的算法详述及其应用发展前景◆鲍蕊娜,等:基于凸壳技术的Delaunay 三角网生成算法研究◆于杰等:Delaunay 三角网构建方法比较研究周围点的提取 点在三角形中的查找 空外接圆判断准则 线段求交问题。
DELAUNAY三角网的算法
二、Delaunay(德洛内)三角网 1、定义:一系列相连但不重叠的三角形的集合,而且 这些三角形的外接圆不包含这个面域的其他人任何点。 2、性质:(1)、每个Delaunay三角形的外接圆不包 含面内其他任何点,即Delaunay三角网的空外接圆 性质。这是创建Delaunay三角网的一项判别标准。 (2)、在由点集V中所能形成的三角网中, Delaunay三角网中三角形的最小角度是最大的。
DELAUNAY三角网的算法
一、引言 TIN(Triangulated Irregular Network,不规则三角网)
是由Peuker和他的同事于1978年设计的一个系 统,它是根据区域的有限个点集将区域划分为相等的 三角面网络,数字高程由连续的三角面组成,三角面 的形状和大小取决于不规则分布的测点的密度和位置, 能够避免地形平坦时的数据冗余,又能按地形特征点 表示数字高程特征。TIN常用来拟合连续分布现象的 覆盖表面。
3、优点:结构良好,数据 结构简单,数据冗余度 小,存储效率高,可适 应各种分布密度的数据。
p1
p4
p2 p3
p6
p5
三、Voronoi图 (泰森多边形或Dirichlet图)
由一组由连接两邻点直线的垂直平分线组成的连续多 边形组成。 N个在平面上有区别的点,按照最邻近原则划分平面; 每个点与它的最近邻区域相关联。 Delaunay三角形是由与相邻Voronoi多边形共享一条 边的相关点连接而成的三角形。 Delaunay三角形的外接圆圆心是与三角形相关的 Voronoi多边形的一个顶点。 Voronoi三角形是Delaunay图的偶图 。
3、根据优化准则对局部新形成的三角形进行优化(如互 换对角线等)。将形成的三角形放入Delaunay三角形链 表。 4、循环执行上述第2步,直到所有散点插入完毕。 上述基于散点的构网算法理论严密、唯一性好,网格满足 空圆特性,较为理想。由其逐点插入的构网过程可知,在 完成构网后,增加新点时,无需对所有的点进行重新构网, 只需对新点的影响三角形范围进行局部联网,且局部联网 的方法简单易行。同样,点的删除、移动也可快速动态地 进行。 但在实际应用当中,这种构网算法不易引入地面的地性线 和特征线,当点集较大时构网速度也较慢,如果点集范围 是非凸区域或者存在内环,则会产生非法三角形。
Delaunay三角网内插多边形算法研究
求 首先建 立 城 市 D M, E 而城 市 的变 化 日新 月 异 , 特别 是 旧城 区的改造 , 求 D M模 型 能及 时更 新 1 数据 结构 要 E 以反 映城 市 的新 面 貌 ; 如铁 路 的选 线 也需 要 在 再 更新 的方 法 有 两 种 : 是 重 建 整 个 区域 的 D M; 一 E 算 法在设 计 数据结 构时 , 点设计 比较 简单 , 只 原 D M 模型 上 内插设 计 好 的 线路 多边 形 。D M E E 有点号及 3 维坐标信息 , 不专门为边设计数据结
构, 将边的信息隐含在三角形数据结构 中, 以节约
二是在原 有 的 D M 基础上 , E 局部 修改需 要 更新 的 存储空间。这里在 D三角网生成时 , . 三角形要求 三 数据。显然第 2种方法即经济又省时。这种情境 顶 点按 逆 时针存 储 , 角形 的数 据结 构 设 计 如 下 下 D M 局部 更新过程 就是在 表达 D M 的三角 网 所 述 。 E E 中 内插一个 多边 形 , 删除原 来 的数据 。 目前 , 并 国
Re e r h o g rt s a c n Al o ihm fDea a i ng l to Ne nt r o a i l g n o l un y Tr a u a i n tI e p l tng Po y o
LI S a ・ a W U n ・ h n L U h ohu , Do g s e g, UO a ・o g HE Zh n mi g L U e f n Xi o ln , e ・ n , I Xu ・e g
先将 多边形 的边作为约束数据入 网, 然后对多边形 内部 三角形进行清 空处理。在影响 区域及 多边形 内部三角
形确定上 , 出了一种快速解决方法, 提 大大提高 了算法的执行 效率。 关 键 词 : e ua ; D l ny 三角 网; a 多边形 ; 内插 ; 算法
机载LiDAR点云的Delaunay三角网快速生成算法
2 . 1 点 云 数 据 分 块
式 在特 定应 用 中具 有 各 自的优 势 … 。其 中 , T I N具 有存 储 高效 、 数 据结 构简 单 、 适 合表 现不规 则地 面特 征、 能够 表示 线性 特 征 和迭 加 任 意形 状 的 区域边 界 等优点 , 能更 好地 表达 目标 的几何 空 间特 征 , 更 大程 度 保 留 地 物 的 形 态 便 于 后 续 处 理 和 分 析 J 。在 T I N生成 方 法 中 , D e l a u n a y三 角 剖 分 具 有 最 小 角 最 大 的 良好性 质 , 是 被公认 的最 优三 角剖分 , 因此 本文
机载激光雷达 ( L i D A R ) 能够快速精确地获取地
物 目标 表面 的位 置 和高 度信 息 , 为 目标 信 息 提取 和 三维重 建 提 供 了新 的数 据 源 。L i D A R 点 云 中各 激 光 点是 离散 的 , 现 有 的代 表 性 的 离散 点 云 数据 表 达
方 法
一
对 点 云数据 中的所 有激 光点 进行 三角形 区域 分
块, 并 确保 每个子 块 内激 光点 个 数 不 超 过个 数 阈值
,
具体 步骤如 下 : ( 1 ) 生成 点 云凸包 。将所 有激 光点 中 , Y , x + y ,
—
Y最大 值 和最 小 值 点 作 为 初 始 凸 包 点 J , 按 照 顺
时针方 向生 成初 始 凸包 , 再 利 用 比较 斜率 的方 法 逐 步生成 点 云的 凸包 ( 如 图 1中 凸包 点 C , i =1 , 2 ,
…
,
8 ) 。
( 2 ) 搜索 点云 重心 点 。计 算 所有 激 光 点 坐标 的
Delaunay三角网剖分中的约束边嵌入算法
is ne, dC ei lmetdb rga ai ,n a codwi q i met o epoet nt csa a b e ne ypo rms sy adcnac r t r ur ns fh rjc. a n n mp e l he e t [ ywod icnt ie d eDean ytag lt n dao a Ke r s o sande g ; l a i uai ;ig n l r u rn o
维普资讯
第 3 卷 第 1 期 3 6
、l , 33 o
・
计
算
机
工
程
20 07年 8月
Au s 0 7 gu t2 0
No J .6
Co pu e gi e i m t rEn ne rng
软件 技术 与数据 库 ・
文章编号:lo 48 076 06_3 文献标识码;A 00 2(H)—05_ H—3 2o l _o
D・ra g l t n i t tin u a i n o CD—ra g l t n t a o sr i e d e i ns re n o D・ a g lto , n l o t n u ai h t n tan d e g si e t d i t t n u a i n a d ony CD・ra g l t n c n p e e tr a e r i n i o c i r t n u ai a r s n e ltr an a d i o e i f t i t u e o a i c n e t s a o t t e a g r h o n e n o s r i e d e n l s s pr e t a g i r le .I n r d c s s me b sc o c p i n b u h l o t m f i s ri g c n ta n d e g ,a ay e e s n lor hms h r c e i t s a d o o i t t ’c a a t rsi n c p e e t a b te l o t m fi s ri g c nsr i e d e — “ n e i g s p i g ag rt m . e a g rt m a fe tv l e l t l k n sof r s n s e tr ag r h o n e n o ta n d e g — i t i s r n ・ wa p n ” l o h t i Th l o ih c n e f c i e y d a wih a l i d
基于三角网生成法的Delaunay三角网生成算法的研究与实现
基于三角网生长法的Delaunay三角网生成算法***************【摘要】论文简要介绍了Delaunay三角网的性质以及基本生成算法,并重点介绍了三角网生长法的基本原理和算法步骤,并通过设计合理的数据结构,对算法进行实现。
对算法进行分析并提出通过构建格网索引,进一步提高三角网生成效率。
【关键词】三角网生长法扩展TIN 格网索引1.引言数字地形模型DTM(Digital Terrain Model)是指对地形表面形态属性信息的数字表达,是带有空间位置特征和地形属性特征的数字描述[1]。
DTM是GIS的基础数据来源,可用于土地利用现状的分析、合理规划及洪水险情预报等。
DTM地形属性为高程时称为数字高程模型(DEM)。
DEM主要的三种表示模型为规则格网模型、等高线模型、不规则三角网模型(Triangular Irregular Network 简称TIN)。
数字化等高线模型不适合计算坡度或制作地貌渲染图等地形分析,规则格网数据结构简单,计算方便;但存在数据冗余,数据采集较麻烦,难以表达复杂地形等缺陷。
TIN即能够避免平坦地形时数据冗余,也能表达复杂地形,可以根据任意地形特征点表示DEM,因此被广泛应用。
Delaunay三角剖分能最大程度的接近等边三角形,避免狭长三角形,并且能保持三角网的唯一性,使其成为生成TIN的最佳选择。
本论文将简要介绍和比较几种常用的Delaunay三角网生成算法(逐点插入法,三角网生长法,分割合并算法等),并且对三角网生长法算法原理进行研究分析和程序实现。
2.Delaunay三角网的性质Delaunay三角网中的三角形必须满足以下几个性质:(1)空圆特性每一个Delaunay三角形的外接圆不包括Delaunay三角网中的任何其他点。
(2)最大最小角特性在三角剖分中,Delaunay三角网的所有三角形的最小角之和最大。
即使得Delaunay三角形最大程度接近等边三角形。
基于Qi算法的Delaunay三角网逐点插入法
关键 词 : e u a D l n y三角 网; a 拓扑关 系; i Q 算法; 效率
d i1 . 9 9 jis . O O 3 7 . 0 1 0 . 1 o : 0 3 6 /.sn 1 O 一 1 7 2 1 . 1 0 9
i e ts o h tt to u t n o h l o i m a m n h wst a hei r d c i ft eQi g rt n o a h c n i r v h fiin yo u l i g De a n y Tra g l t n u i g p i t mp o et e e f e c fb i n l u a in u a i sn on - c d o
De a n y Tra g l t n efce ty Afe n l zn h r c d r f c n tu t n o l u a i n u a i n wih u o t o l u a in u a i fi in l . t r a a y i g t e p o e u e o o s r c i f De a n y Tra g l t t o t c n r l o o o
过 程 中, 次 引入 Q 算 法 , 而提 高 了构 网 的 效 率 。 为 了验 证 上述 模 型 , 们 在 Mi oot i a Su i 20 再 i 从 我 c sf V s l td 0 5开 r u o
发环境 下 , C 以 #为开发 工具 , 采用底层开发模 式实现 了改进 的逐 点插 入 法, 实验 证 明引入 Q 算法能够提高逐 点 i
b u d r sn on -n eto to t ea t o sito u e h lo ih t h e tp o ulig n d -o oo y Th o n a yu ig p itis rin meh d,h uh r n r d c dt eQi g rtm o t ek yse fb i n o etp lg . e a d Qi lo ih wa d p e g i e n e t gc n tan d b u d r sit h lu a in ua in t r v h fiin g rtm sa o tda an wh ni sri o srie o n a i n ot eDea n yTra g lto oi a n e mp o et eef e — c
不规则三角网(TIN)生成的算法
可见,由于步骤(3)的处理,保证相邻的数据点渐次插入,并通过搜寻加入点的影响三角网(Influence Triangulation),现存的三角网在局部范围内得到了动态更新。从而大大提高了寻找包含数据点的三角形的效率。
5.3
当不相交的地形特征线、特殊的范围边界线等被作为预先定义的限制条件作用于TIN的生成当中时,必须考虑带约束条件的Delaunay三角网。最简单的处理方法是所谓的“加密法”,即通过加密约束线段上的数据点,将约束数据转换为普通数据,从而按标准Delaunay三角形剖分即可。尽管该方法加大了数据量并改变了原始数据集,但由于简单易行、稳定可靠,在许多情况下可以很好地满足需要。该方法唯一的问题在于如何恰当地确定特征线上加密数据点之间的距离,一般取平均数据点间距的一半或更小即可。以下内容主要介绍直接处理约束线段的算法。
定义2:令单点集M和线段端点集E之并为V(V=M∪E),如果在V的每个Delaunay三角形的外接圆范围内不包含任何与三角形的顶点均通视的其它点,而点Pi与Pj(Pi,Pj∈V)当且仅当连线PiPj不与L中的任何约束线段相交叉(除在端点处外)时才互相通视,那么称这个Delaunay三角网为V由L约束的Delaunay三角网(朱庆,陈楚江,1998)。
(a)三角形与等高线相交;(b)三角形的三个顶点都位于同一条等高线上
图5.3.3对等高线进行不合理三角化的例子
将等高线作为特征线生成三角网一般有两种算法:将等高线作为特征线的方法、自动增加特征点及优化TIN的方法。
将每一条等高线当作断裂线或结构线时,对三角形而言,至多只能从同一等高线取两个点。图5.3.4显示了一个考虑等高线特性的Delaunay三角网。
(1)搜寻分别对应x-y,x+y最大值及x-y,x+y最小值的各二个点。这些点为凸闭包的顶点,且总是位于数据集的四个角上,如图5.1.2(a)中的点7,9,12,6所示;
TIN_边生长法
算法简介
Delaunay三角网 (Delaunay Triangulation Irregular Network ,D-TIN) 是一系列相互连接但不重合的三角形的集合,每个三角形的外接圆内, 不包含其他的点,是空外接圆。 其次,点集构成的三角网中,delaunay三角网的三角形的最小内角最大。
P4 P3
P5 P2
P1
常用构建D-TIN算法:递归生长算法 逐点插入法 凸闭包收缩法
基础算法
ห้องสมุดไป่ตู้ 基础算法
如何判断点在直线的左侧还是右侧:平面上三点的面积量
y p1
p2
p3 x
S (P1, P2 , P3 )
x1 x3 x2 x3 y1 y3 y2 y3
S 0, 在矢量 P1P2 左侧
S 0, 在矢量 P1P2 右侧
p3
x
递归生长法
递归生长法
P3 P2
P1
递归生长法
P3’ P3
P2 P1
递归生长法
P3 P3’’
P2 P1
递归生长法
出现重复情况,就把新生成的边删除,最后就保留了不重复的边
P5 P3
P2
P1
P6 P4
P8
P7
递归生长法
THANKS
S =0, 在矢量 P1P2 上
基础算法
判断距离直线最近的点:夹角最大原则
y p1
a b a b cos
a b xa xb ya yb
p2
cos
(x1 x3 ) (x2 x3 ) (y1 y3 ) (y2 y3 )
(x1 x3 )2 (y1 y3 )2 (x2 x3 )2 (y2 y3 )2
Delaunay三角剖分的几种算法综述
De u a - 剖 分 l ny5 a
约束三 角剖分
、
引 言
D l ny e u a 三角剖 分广泛地应用在 有限元分析 、 a 信息可视化 、 计算机 图形学等领域 。D l ny e u a 三角 网具有 优 良的几 何特性 , a 如空外 圆性 质 、 最 小角最大 的性质等 , 公认的最 优三角 网u 当前 , 是 。 构建三角 网的算 法 可以分为 3 : 类 分治法 、 逐点插 入法和三角 网生长法。分治法 的效 率 最 高 ; 逐点插入法实现简单高效 , 占用内存较小 , 但它 的时 间复杂度差 , 三角网生长法 由于效率 相对较低 , 前采用较少 。约束 D l n y 目 e u a 三 a 角剖分 具 D l ny 慊 e u a 三角剖分的优点 , 广泛应用在地学及计算机领 a 并 域 。De u a 剖分是一种三角剖分 的标准 , l ny a 实现它有多种算法 。 二 、 ea n y D lu a 三角剖分的常见算法 1 a sn . w o 算法 L 逐点插入 的L w o 算法是 L w o 在 17 年提出的 , a sn a sn 9 7 该算法思路简 单, 易于编程实 现。基本原 理为 : 首先 建立一个 大的三角形或 多边形 , 把所有数据点包 围起来 , 向其 中插入一点 , 点与包含它的三角形三个 该 顶点 相连 , 形成 三个新 的三角形 , 后逐个对 它们进行空外 接圆检测 , 然 同时用 L w o 设计 的局部优化 过程 L P 行优化 , as n O进 即通过 交换对角线 的方法来保证所形成 的三角 网为 D lu a 三角 网。 e ny a 上述 基 于散点 的构 网算 法理 论严 密 、 唯一性好 , 网格 满足 空 圆特 性 , 为理想 。由其逐点 插入 的构网过程 可知 , 到非 D l ny 较 遇 ea a 边时 , u 通过删 除调 整 , 可以构造形成新 的 D lu a 边 。在完成 构网后 , eany 增加新 点时 , 无需对所 有的点进行重新构 网, 只需对 新点的影响三角形范 围进 行局部联 网 , 局部联 网的方 法简单易 行。 同样 , 且 点的删除 、 移动也可 快速动态地进行 。但 在实际应用 当中, 当点集较 大时构网速度也较慢 , 如果点集范 围是非 凸区域或者存在 内环 , 则会产生非法三角形 。
浅谈Delaunay 三角网的并行构建和更新
浅谈Delaunay 三角网的并行构建和更新随着测量技术的发展和新型测量设备的出现,空间数据的获取变得更加容易和快捷,与此同时,数据量也呈爆炸性的增长。
如何利用这些海量的空间数据实现数字地面模型DTM 的高效构建是当前空间分析及应用领域亟需解决的问题之一。
Delaunay 三角网以其唯一性、空圆性、能以不同分辨率表达地形、适合各种分布的数据等诸多优点而被广泛地应用于DTM 建模中。
长久以来,国内外学者对Delaunay 三角网的构建提出了多种算法。
这些算法按实现过程大致可以分为三类:逐点插入法、分治法和扫描线法。
陈楚江等提出了实现三角网局部更新的方法。
陈少勤等提出利用多源数据实现不规则三角网的动态更新。
但这些算法都是基于串行程序实现,不支持点并行的插入和删除。
随着多核计算机的普及,并行为解决大数据量的不规则三角网(TIN)构建和更新提供了新的思路。
不少学者也对此做了研究,李坚等提出将分治算法与流数据处理方法相结合,利用多核处理器平台进行并行运算。
张真[7]提出一种适用于并行计算的归并构网方法。
这些算法满足于Delaunay 三角网的并行构建,但不适用于三角网的并行动态更新。
因为在这些算法在开始之前,点集必须是确定的,而三角网更新时,被插入(删除)点是不确定的。
文章提出一种单机多核环境下Delaunay 三角网并行构建算法,该算法将数据进行格网划分,每一个数据块作为一个工作单元。
同时为解决内存共享带来的问题,可以为各工作单元分配独立的内存空间,工作单元之间相对独立,因此可以很好的实现三角网的并行构建和更新。
并行算法采用数据分块[8]的思想,首先将点数据按给定阈值(实验中发现阈值选择受实验环境影响)进行格网划分,每一个数据块形成一个独立的工作单元。
每一个工作单元只负责所属区域内三角网的构建更新。
利用计算机单机多核的优势,可以同时将多个工作单元分配给计算机进行处理。
最后将相邻的区域进行合并,最终完成三角网的构建。
约束条件下不规则delaunay三角网构建方法
约束条件下不规则delaunay三角网构建方法
不规则Delaunay三角网构建是一种在约束条件下构建三角网的方法,它可以有效地构建出满足约束条件的三角网。
首先,需要确定约束条件,即确定三角网中的节点和边的位置。
然后,根据约束条件,使用Delaunay三角剖分算法构建三角网。
Delaunay三角剖分算法是一种基于三角形的空间划分算法,它可以将空间划分为一系列的三角形,使得每个三角形的外接圆内没有其他节点。
这样,就可以构建出满足约束条件的三角网。
最后,需要对构建的三角网进行优化,以满足约束条件。
优化的方法有很多,比如调整节点位置、添加新的节点、删除多余的节点等。
这些优化操作可以使得构建的三角网更加符合约束条件,从而提高三角网的质量。
总之,不规则Delaunay三角网构建是一种在约束条件下构建三角网的有效方法,它可以有效地构建出满足约束条件的三角网,并且可以通过优化操作来提高三角网的质量。
2D-Delaunay 三角网格的数据结构与遍历
2D-Delaunay三角网格的数据结构与遍历高晓沨1,黄懿2(1.清华大学数学系,北京 100080;南开大学数学科学学院,天津 300071) 摘要:本文总结了二维Delaunay三角网格的Bowyer-Watson自动生成算法及其实现步骤,提出了一种类的结构、函数范例(采用Visual C++ 6.0编写程序),并讨论了遍历三角网格各种方法的优劣性,给出实验数据对比;最后得出结论,用广度优先的遍历方法创建网格是生成三角网格一种相对便利有效率的方法;另外,讨论了初始点加入顺序对程序运行时间的影响。
关键词:Delaunay三角网格 类结构 自动生成 广度优先遍历Data Structure and Traverse of 2D-Delaunay TriangulationGao Xiaofeng1, Huang Yi2(Department of Mathematics ,Tsinghua University; Beijing,100080College of Mathematics, Nankai University, Tianjin, 300071) Abstruct: The article summarized the realization of 2D-Delaunay triangulation, thesteps of creating Bowyer-Watson automatic mesh generator, and then constructed a kindof Class structure as well as functions of this algorithm (using Visual C++ 6.0), andfinally discussed the advantage and disadvantage of different methods to traverse thetriangle mesh, using data examination as contrast. Lastly, the author got theconclusion that Width First Traversal method is more effective and convenient. Besides,we discussed the effect between the order of original point set and running time ofthe program.Key Word: Delaunay Triangulation, Class Structure,automatic generation, Width FirstTraversal1.引言近年来,平面任意点集的三角网格化(triangulation)问题一直是人们密切关注的问题。
Delaunay三角剖分
Delauney三角网剖分算法原理:分为三步:一、凸包生成:1)求出如下四点:min(x-y)、min(x+y)、max(x-y)、max(x+y)并顺次放入一个数组,组成初始凸包;2)对于凸包上的点I,设它的后续点为J,计算矢量线段IJ右侧的所有点到IJ的距离,求出距离最大的点K;3)将K插入I,J之间,并将K赋给J;4)重复2,3步,直到点集中没有在IJ右侧的点为止;5)将J赋给I,J取其后续点,重复2,3,4步,当遍历了一次凸包后,凸包生成完成。
二、环切边界法凸包三角剖分:在凸包数组中,每次寻找一个由相邻两条凸包边组成的三角形,在该三角形的内部和边界上都不包含凸包上的任何其他点,然后去掉该点得到新的凸包链表,重复这个过程,最终对凸包数组中的点进行三角剖分成功。
三、离散的内插:1)建立三角形的外接圆,找出外接圆包含待插入点的所有三角形,构成插入区域;2)删除插入区域内的三角形公共边,形成由影响三角形顶点构成的多边形;3)将插入点与多边形所有顶点相连,构成新的Delaunay三角形;4)重复1,2,3,直到所有非凸包上的离散点都插入完为止。
功能实现流程:1. 在绘图菜单栏下添加一个子菜单项为Delauney,并且在工具栏上添加一个工具项。
设置text为Delaunay三角剖分,name为delaunay等属性,添加单击事件,并为单击事件代码2.为事件函数添加如下代码Graphics gra = panel1.CreateGraphics();List<Point_T> pts = new List<Point_T>();foreach (Geometry_T geo in choosegeos.Geofeatures){if (geo.GetType() == typeof(Point_T)){Point_T pt = (Point_T)geo;pts.Add(pt);}}List<Tin> deltins = DelauneyTin(pts);//根据多点构建delauney三角网foreach (Tin tin in deltins){Point[] ctin = new Point[3];for (int i = 0; i < 3; i++){cp = new Point((int)tin.Pthree[i].X, (int)tin.Pthree[i].Y); ctin[i] = cp;}gra.DrawPolygon(Pens.Red, ctin);}3.三角形TIN的数据结构public class Tin{Point_T[] pthree = new Point_T[3];Line_T[] lthree = new Line_T[3];public Line_T[] Lthree{get { return lthree; }set { lthree = value; }}public Point_T[] Pthree{get { return pthree; }set { pthree = value; }}public Tin(){ }public Tin(Point_T p1, Point_T p2, Point_T p3){pthree[0] = p1;pthree[1] = p2;pthree[2] = p3;lthree[0] = new Line_T(p1, p2);lthree[1] = new Line_T(p2, p3);lthree[2] = new Line_T(p3, p1);}}4.圆的数据结构public class Circle_T:Geometry_T{private Point_T cpt;public Point_T Cpt{get { return cpt; }set { cpt = value; }}double radius;public double Radius{get { return radius; }set { radius = value; }}public Circle_T(){ }public Circle_T(Point_T pt, double r){cpt = pt;radius = r;}}5.实现Delaunay三角剖分算法1)public List<Tin> DelauneyTin(List<Point_T> pts)//根据多点构建delauney三角网;分三步:构建凸包;凸包剖分;离散点内插{Graphics gra = panel1.CreateGraphics();List<Tin> deltins = new List<Tin>();List<Point_T> envpts = EnvelopeTin(pts);//构建凸包//for (int i = 0; i < envpts.Count - 1; i++)//{// gra.DrawLine(Pens.Black, new Point((int)envpts[i].X,(int)envpts[i].Y), new Point((int)envpts[i + 1].X, (int)envpts[i + 1].Y));//}//gra.DrawLine(Pens.Black, new Point((int)envpts[0].X, (int)envpts[0].Y), new Point((int)envpts[envpts.Count - 1].X, (int)envpts[envpts.Count - 1].Y));List<Point_T> dispts = new List<Point_T>();//非凸包上的离散点foreach (Point_T pt in pts){if (!envpts.Contains(pt)){dispts.Add(pt);}}List<Tin> envtins = EnvelopeDivision(envpts);//凸包剖分//foreach (Tin tin in envtins)//{// Point[] ctin = new Point[3];// for (int i = 0; i < 3; i++)// {// cp = new Point((int)tin.Pthree[i].X, (int)tin.Pthree[i].Y);// ctin[i] = cp;// }// gra.DrawPolygon(Pens.Blue, ctin);//}deltins = TinInsert(envtins, dispts);//离散点内插return deltins;}2)public List<Point_T> EnvelopeTin(List<Point_T> pts)//构建凸包{List<Point_T> envpts = new List<Point_T>();List<Point_T> othpts = new List<Point_T>();foreach (Point_T pt in pts){othpts.Add(pt);}//构建以x-y,x+y最大最小值组成的初始矩形框CompareXaddY comxandy = new CompareXaddY();CompareXsubY comxsuby = new CompareXsubY();pts.Sort(comxsuby);envpts.Add(pts[0]);envpts.Add(pts[pts.Count - 1]);othpts.Remove(pts[0]);othpts.Remove(pts[pts.Count-1]);pts.Sort(comxandy);if(!envpts.Contains(pts[0])){envpts.Insert(1, pts[0]);}if (!envpts.Contains(pts[pts.Count - 1])){envpts.Add(pts[pts.Count - 1]);}othpts.Remove(pts[0]);othpts.Remove(pts[pts.Count-1]);//构建以x-y,x+y最大最小值组成的初始矩形框int i = 0;int tag = 0;bool over = true;while(i<envpts.Count){Line_T cline;if (i==envpts.Count-1){cline = new Line_T(envpts[i], envpts[0]);}else{cline = new Line_T(envpts[i], envpts[i + 1]);}double dismax=0;for (int j = 0; j < othpts.Count ;j++ ){if (IsLeftPoint(othpts[j], cline)){double distance = PointToLine(othpts[j], cline);if (distance > dismax){dismax = distance;tag = j;over = false;}}}if (over){i++;}else{//envpts.RemoveAt(i);envpts.Insert(i+1, othpts[tag]);over = true;}}return envpts;}public List<Tin> EnvelopeDivision(List<Point_T> pts)//凸包剖分{List<Tin> envtins = new List<Tin>();List<Point_T> cpts = new List<Point_T>();foreach (Point_T pt in pts){cpts.Add(pt);}while (cpts.Count > 2){int tag = 0;double minangle = 120;for (int i = 0; i < cpts.Count; i++){double angle;if (i == 0){angle = CalcuAngle(cpts[cpts.Count - 1], cpts[i], cpts[i + 1]);}else if (i == cpts.Count - 1){angle = CalcuAngle(cpts[i-1], cpts[i], cpts[0]);}else{angle = CalcuAngle(cpts[i-1], cpts[i], cpts[i + 1]);}if ((angle - 60) < minangle){minangle = angle - 60;tag = i;}}int btag=tag-1;int atag=tag+1;if (tag == 0){btag = cpts.Count - 1;}else if (tag == cpts.Count - 1){atag = 0;}Tin ctin = new Tin(cpts[btag], cpts[tag], cpts[atag]);envtins.Add(ctin);cpts.RemoveAt(tag);}return envtins;}public List<Tin> TinInsert(List<Tin> tins, List<Point_T> pts)//离散点内插 {List<Tin> deltins = new List<Tin>();List<Tin> ctins = new List<Tin>();//临时凸包foreach (Tin tin in tins){ctins.Add(tin);}foreach (Point_T pt in pts)//对离散点遍历,内插{List<Point_T> cpts = new List<Point_T>();//临时点集foreach (Tin tin in ctins)//找到外接圆包含离散点的三角形{Circle_T ccir = DelauneyCicle(tin);//构造外接圆if (IsPointInCircle(pt, ccir))//点是否包含在圆内{//for (int i = 0; i < 3; i++)//{// if (!cpts.Contains(tin.Pthree[i]))// {// cpts.Add(tin.Pthree[i]);//记录当前点// }//}deltins.Add(tin); //记录保存当前三角形}}//List<Point_T> ecpts = EnvelopeTin(cpts);//求点集(外接圆包含离散的三角形)的凸包?,接下来,插入点,构建新三角网//for (int j = 0; j < ecpts.Count;j++ )//{// Tin tin;// if (j == ecpts.Count-1)// {// tin = new Tin(ecpts[j], ecpts[0], pt);// }// else// {// tin=new Tin(ecpts[j],ecpts[j+1],pt);// }// ctins.Add(tin);//}List<Line_T> eli = BorderTin(deltins);foreach (Line_T line in eli){Tin tin = new Tin(line.Frompt, line.Topt, pt);ctins.Add(tin);}foreach (Tin tin in deltins)//改变临时三角网(删除deltins保存的三角网){ctins.Remove(tin);}deltins.Clear();}return ctins;}3)public bool IsLeftPoint(Point_T pt, Line_T line)//点在线的左边;叉积大于{bool yes = false;if ((pt.X - line.Frompt.X) * line.ParaA + (pt.Y - line.Frompt.Y) * line.ParaB > 0){yes = true;}return yes;}public double CalcuAngle(Point_T fp, Point_T mp, Point_T tp)//首,中,尾三点构成的夹角{double angle = 0;Point_T vector1 = new Point_T(fp.X - mp.X, fp.Y - mp.Y);Point_T vector2 = new Point_T(tp.X - mp.X, tp.Y - mp.Y);angle = Math.Acos((vector1.X * vector2.X + vector1.Y * vector2.Y) /(Math.Sqrt(vector1.X * vector1.X + vector1.Y * vector1.Y) *Math.Sqrt(vector2.X * vector2.X + vector2.Y * vector2.Y)));return angle;}public Circle_T DelauneyCicle(Tin tin)//构建三角形的外接圆{double x1 = tin.Pthree[0].X;double x2 = tin.Pthree[1].X;double x3 = tin.Pthree[2].X;double y1 = tin.Pthree[0].Y;double y2 = tin.Pthree[1].Y;double y3 = tin.Pthree[2].Y;double x = ((y2 - y1) * (y3 * y3 - y1 * y1 + x3 * x3 - x1 * x1) - (y3 - y1) * (y2 * y2 - y1 * y1 + x2 * x2 - x1 * x1))/ (2 * (x3 - x1) * (y2 - y1) - 2 * ((x2 - x1) * (y3 - y1)));double y = ((x2 - x1) * (x3 * x3 - x1 * x1 + y3 * y3 - y1 * y1) - (x3 - x1) * (x2 * x2 - x1 * x1 + y2 * y2 - y1 * y1))/ (2 * (y3 - y1) * (x2 - x1) - 2 * ((y2 - y1) * (x3 - x1)));Point_T cpt = new Point_T(x, y);double radius=Math.Sqrt(Math.Pow((x1-x),2)+Math.Pow((y1-y),2));Circle_T cir = new Circle_T(cpt,radius);return cir;}public bool IsPointInCircle(Point_T pt, Circle_T cir){if(Math.Sqrt(Math.Pow((pt.X-cir.Cpt.X),2)+Math.Pow((pt.Y-cir.Cpt.Y),2))<cir.Radius) {return true;}elsereturn false;}public List<Line_T> BorderTin(List<Tin> tins){List<Line_T> borli = new List<Line_T>();for (int i = 0; i < tins.Count; i++){for (int t = 0; t < 3; t++){bool tag = false;Line_T cl = tins[i].Lthree[t];for (int j = 0; j < tins.Count; j++){if (j!=i&&IsContainByTin(cl, tins[j])){tag = true;}}if (!tag)borli.Add(cl);}}return borli;}public bool IsContainByTin(Line_T li, Tin tin){for (int i = 0; i < 3; i++){if ((li.Frompt == tin.Lthree[i].Frompt || li.Frompt ==tin.Lthree[i].Topt) && (li.Topt == tin.Lthree[i].Topt || li.Topt ==tin.Lthree[i].Frompt)){return true;}}return false;}6.实现两个排序类CompareXsubY(x-y排序)和CompareXaddY(x+y 排序),仿照CompareX写功能操作步骤:先在面板上绘制多个点;框选部分点;按下实现Delaunay三角网剖分工具,Delaunay三角网剖分成功。
约束Delaunay三角网模型的插入约束线段算法浅析
基 于 约束 D e l a u n a y 三 角 网动态 插入 约束 线 段算 法 的基 本 思想 为 :定位 待插 入线 段 的起 始点 所在 的三 角 形 ,利用方 向搜索 ,定位待 插入线段终止 点所在 的三角
坐标等于零 ( 假设 为 s l 1 ,如 图 1( b ) ) 。此时 ,根 据三 角形 查找顺序 的不 同也有 两种 可能情况 ,判 断待 插入线
的第 一组 三角形 ,是 以线段起始点为一顶 点的所有三角
形 。根 据三角形 ( s t a r t t i n ) ,并 依靠线段 类和三 角形类 的 数 据结 构 ,在三角 形 ( s t a r t t i n )中 ,由包含 起 始点 的一 边开始 ,逆 时针方向搜索三角形 ,查找 一周 ,直到 回到 三 角形 ( s t a r t t i n ) ,将搜索 到的所有三 角形都存人 三角形 删 除链表 ,并将 这些三角形 中以起始点 为一端 点的两边
情况 :如 图 1 所示 ,设 起始点与其所在 三角形 的面积坐 标依次 为 s l l 、s 1 2和 s l 3 。
局 部更新 。其 中 ,新 插入 的数 据 线是在 D E M模 型 的局 部范 围内进 行的 。不应 导致整个模 型的重建 。在基 于一 次性 构建约束 D e l a u n a y 三角 网算 法生成 的 D E M模 型l 1 『 I 2 1 基础 上 ,研 究并实现 了如何快速 、高效 地插入约束线 段
作者 简 介 :任 振娜 ( 1 9 8 0 一 ) ,女 ,讲 师 ,硕 士 ,研究
方 向 :地理信息 系统应 用 。
收稿 日期 :2 0 1 7 — 0 8 — 3 0
逛》
与
…
数字地面模型 第五章 不规则三角网(TIN)的生成 Voronoi图与Delaunay三角形
对于点集P存在着多种三角网剖分方式,其中,Delaunay三角网在地 形拟合方面表现最为出色,因此,常被用作TIN的生成。
1.3 TIN 的数据存储方式
TIN的数据存储方式比格网DEM复杂,它不仅要存储每个点的高程, 还要存储其平面坐标、节点连接的拓扑关系、三角形编号及其邻接三角 形编号等内容。
1 3 II 4 2 III I Ⅵ Ⅳ 5 Ⅶ
生成三角形网
⑤ 置K=K+1; ⑥ 从K号三角形的第一条边(IB1(K) ,IB2(K) )向外扩展:首先,建立直线判别正负区法 的判别式,确保包含顶点IB3(K)一侧的离散点必须被排除,具体方法是:先将K号三角
形的第三个顶点 IB3(K) 的坐标代入F(X,Y),记录所得值的符号,送入M单元,将所
成开放的区域外,其余每个点都形成一个凸多边 形。
2.3 Delaunay三角网
Delaunay三角网是V-图的伴生图形,它是相互邻接且互不重叠的三角形集合。 D-三角网的定义是:有公共边的V-多边形称为相邻的V-多边形。连接所有相邻 的V-多边形的生长中心所形成的三角网称为D-三角网。
D-三角网的外边界是一个凸多边形,它由连接V中的凸集形成,通常称为凸壳。 D-三角网具有两个非常重要的性质。
8
Ⅷ
7 V 6
1.4 TIN模型的优缺点
TIN模型是一种表示数字高程模型的有效数据模型,相对于规则格网 DEM而言,它的优点包括:
大大减少了数据冗余,同时有效保持了地面的特征地形; 有利于表达特征地貌、地面细节的表达精度一般较高; 它的精度与地面实测数据的获取方法、密度以及分布特征相关; 可以方便地进行一些地形分析,如坡度坡向分析、地形通视分析、等高线自动生 成与三维显示等;
约束Delaunay三角网生成算法的研究与应用
定义 2 三角形的 3个顶点 中 X坐标 值最 大或者最 小 , Y坐标值最 大或者最小 的顶点称为三角形 的极 点。
2 1 基 于三 角 形 方 向 搜 索定 位 法 .
1 基本 概 念与 数据 结构
1 1 术 Байду номын сангаас定 义 .
定 义 1 设 V ,v2 , ,V4 V1是 一 个 三 角 形 ,沿 ,、 3 一 着 V > v2 > v 一 > v 一 一 3 4的 方 向行 进 ,若 三 角 形 始 终 位
法 的局 限性 使得 海 量 数 据 的 处 理 称 为 一 个 难 题 。 经 研 究 发
现 ,将 逐点插入 法与 归并法 结合_ 的合成 算法能 发挥 两者 4
的 优 势 ,兼 顾 空 间 与 时 间 的 性 能 。然 而 对 于 逐 点 插 入 法 , 在 定 位 插 入 点 所 在 的 三 角 形 时 需 要 反 复 遍 历 整 个 三 角 形 链 表 ,非 常 耗 时 ,定 位 插 入 点 这 一 过 程 成 为 了 合 成 算 法 效 率
s o t a h s ag rt m smo e sa l n r f ce c . h w h tt i l o ih i r t b ea d mo e ef in y i Ke r s y wo d :Dea n y ti n u a in;i fu n e d man;s n h s l o i m ;q ik y lc t g o s i t rd lu a ra g l t o nle c o i y t e i ag rt s h u c l a i ;c n t u e g i o n t
快速定位插入点所 在 的三角形 能够 提高子模 块 中逐点
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
p1
p4
p2 p3
p6
p5
三、Voronoi图 (泰森多边形或Dirichlet图)
由一组由连接两邻点直线的垂直平分线组成的连续多 边形组成。 N个在平面上有区别的点,按照最邻近原则划分平面; 每个点与它的最近邻区域相关联。 Delaunay三角形是由与相邻Voronoi多边形共享一条 边的相关点连接而成的三角形。 Delaunay三角形的外接圆圆心是与三角形相关的 Voronoi多边形的一个顶点。
Voronoi三角形是Delaunay图的偶图 。
4、依次将新形成的三角形的边作为基边,形成新 的控制边链表,按照上述第2步,对控制边链表所 有的线段进行循环,再次向外扩展,直到所有三 角形不能再向外扩展为止。
NT
2019/6/3
2019SUCCESS
THANK YOU
2019/6/3