没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
西南交通大学
本科生实习报告
基于离散点的构 TIN 算法
1
目录
1 实验目的 ....................................................................................................................................... 2
2 实验原理 ....................................................................................................................................... 2
3 算法设计 ....................................................................................................................................... 2
3.1 算法思想 ............................................................................................................................ 2
3.2 算法步骤 ........................................................................................................................... 2
3.3 算法流程 ........................................................................................................................... 5
4 程序设计 ....................................................................................................................................... 6
5 运行结果 ....................................................................................................................................... 6
5 实习中发生、发现的问题及处理情况 ....................................................................................... 8
6 实习收获、体会及建议 ............................................................................................................... 9
7 附录............................................................................................................................................... 9
基于离散点的构 TIN 算法
2
1 实验目的
根据已学的数字高程模型中不规则三角网相关知识,编写一个自动生成不规则三角
网的程序。
2 实验原理
本次实验采用三角网生长算法构建不规则三角网。首先找出离散点集中相距最短的
两点连接成为第一条 Delaunay 边,然后按照距离该边中点最近的原则找出包含此边的
Delaunay 三角形的另一端点,依次处理所有新生成的边,直至最终完成。在构建不规则
三角网的过程中,按照统一方向实时记录所形成边、三角形顶点编号及其相互邻接关系,
形成完整的拓扑关系,以满足实际应用的需要。此外,为了具有更好的界面效果和可操
作性,本次实验利用 C#语言编写程序。
3 算法设计
3.1 算法思想
1. 首先,找出离散点集中相距最近的两点,连接这两点形成 TIN 的初始基线;
2. 然后,按照距离该边中点最近的原则,找出包含此基线的另外一个点构成三角形;
3. 连接新点与基线的两个端点形成两条新边,构成三角形;
4. 以这两条新边为基线,重复上述过程。直到两条新边扩展完成;
5. 重复上述过程,依此循环处理所有新边。直到所有离散点均成为 TIN 的端点。
3.2 算法步骤
1. 数据组织结构设计
1.1 定义 Line 类,用以记录三角网中的边信息。包括字段:ID(边编号),Point[3]
(边的起点和终点),Bor[2](边的左、右邻接三角形)。实例化获得变量 Line[];
1.2 定义 Triangle 类,用以记录 Delaunay 三角形信息。包括字段:ID(三角形编号),
Peak[3](三角形顶点编号),Line[3](三角形的三边), Bor[3](邻接三角形)。注
意:此处的字段 Line[3]为上述定义的 Line 类型。实例化获得变量 Tri[];
1.3 计数变量 K,L 分别记录扩展的三角形数和已形成的三角形数,o 用以记录形成
的边的数目;
1.4 在第一个三角形形成之后,分别置:L=1,K=0,o=3。
2. 拓扑关系构建过程的原则
基于离散点的构 TIN 算法
3
为了保证拓扑关系正确性,该算法的几个重要原则如下:
(1)、对于任意一个三角形,它的 0 号边(Line[0])是指起点为 0 号顶点(Peak[0]),
终点为 1 号顶点(Peak[1])的一条有向线段;其 1 号边(Line[1])是指起点为 1
号顶点(Peak[1]),终点为 2 号顶点(Peak[2])的有向线段;它的 2 号边(Line[2])
是 指起点为 2 号顶点(Peak[2]),终点为 0 号顶点(Peak[0])的有向线段;
(2)、对于任意一个三角形,它的 Bor[0]是指它的 Line[0]所外邻的三角形;它的 Bor[1]
是指它的 Line[1]所外邻的三角形;它的 Bor[2]是指它的 Line[2]所外邻的三角形。
(3)、对于该算法,无需提前计算出或确定出拓扑关系的记录方向,因为这不影响拓扑
关系的正确建立。事实上,三角网拓扑关系的记录方向为顺时针或逆时针,是取
决于首三角形的三个顶点的记录顺序的,其后的记录顺序均与之相同。
3. 确定首三角形
2.1 找出离散点集中相距最近的两点,连接这两点形成首三角形的第一条边;
2.2 找出第 1 第 2 顶点连线中点最近的且不与两顶点共线的点作为首三角形的第 3 个
顶点;
2.3 记录三边信息。在变量 Line[]中按照顶点编号 0-1,1-2,2-0 的顺序记录,将三条边
的 Bor[0]都记为 1。注意:边是有方向的,要注意记录的顺序;
2.4 记录首三角形信息。在变量 Tri[0].Peak[]中依此记录第 1、2、3 顶点的编号,在
Tri[0].Line[]中记录三边信息(将上述 2.3 步所得 Line[]赋给 Tri[0].Line[]即可)。
4. 扩展三角形
3.1 首先从 K+1 号三角形(Tri[K])的第一条边(Tri[K].Line[0])向外扩展;
3.2 显然位于 Tri[K].Peak[2]同侧的数据点应该被排除在外,可以利用直线方程来实现
上述目标。具体过程如下:
( , ) ( )f x y y ax b
上式中:
21
21
()
()
yy
a
xx
,
1 2 2 1
21
x y x y
b
xx
若有任意点
( , )P x y
,将
( , )P x y
代入上式,并判断:
若
( , ) 0f x y
,
( , )P x y
位于 Tri[K].Line[0]的正区;
若
( , ) 0f x y
,
( , )P x y
位于 Tri[K].Line[0]的边上;
若
( , ) 0f x y
,
( , )P x y
位于 Tri[K].Line[0]的负区;
3.3 寻找可能的扩展点。将 Tri[K].Peak[2]代入
( , )f x y
,记下
( , )f x y
值的符号。然
后,将其余离散点
( , )P x y
代入
( , )f x y
,逐个比较判别式值的符号。只有当数据
点的判别式值与 Tri[K].Peak[2]判别式值符号相反时成为可能被扩充的点。如果至
少可以找到一个扩展点,则进行下述步骤 3.4----3.7,否则进行步骤 3.8。
3.4 判断扩展点。在这些可能成为被扩充的点中,利用三角形的余弦定理,找出对扩
张边张角最大的点
max{ }
i
C
,则该点即为要扩充的点。
基于离散点的构 TIN 算法
4
2 2 2
cos
2
a b c
C
ab
3.5 检查。为了避免交叉,需要判断新的三角形的三条边是否已被已形成的三角形用
过两次,若有一条边已经被使用过两次,则此三角形无效;否则,该三角形应该
被确认,即 Tri[L]的三个顶点可以确定下来。
3.6 边和三角形的形成及其拓扑关系的完善。
1) 边的形成。假设找到的扩展点号为 m,对于上述所确定的三角形的三个顶点,
可形成三条有方向的边。此处应该注意的是:由于边是有方向的,应该按照
Tri[K].Peak[1]--Tri[K].Peak[0],,Tri[K].Peak[1]--m ,m--Tri[K].Peak[1]的顺序
连接形成新边 Line[o]、Line[o+1]和 Line[o+1]。
2) 建立边的拓扑关系。对于上述新形成的三条边,将它们的 Bor[0]均赋为 L+1;
此处还应分别对三条边做判断:是否构成某边的两个端点之前已经形成过边。
具体如下:
a、若构成某边的两个端点之前没有形成过边,则该边的 Bor[1]= -1;
b、若构成某边的两个端点之前已经形成过边,则要搜索找出之前已经用过
这两个点的边 k,令 Bor[1]=Line[k].Bor[0],同时也要完善边 Line[k]的拓
扑关系,即令 Line[k].Bor[1]=L+1;
3) 三角形的形成。对于找到的扩展点 m,可以形成新三角形 Tri[L],进行如下
赋值:Tri[L].Peak[0]= Tri[K].Peak[1] ,Tri[L].Peak[1]= Tri[L].Peak[0],
Tri[L].Peak[2]= m;此外,将上述 1)步形成的三条边分别赋给三角形 Tri[L]
的三条边,赋值的过程中要注意对应关系;
4) 建立三角形的拓扑关系。对于新形成的三角形 Tri[L],可 确定其邻接三角形,
即:Tri[L].Bor[0]= Tri[L].Line[0].Bor[1];Tri[L].Bor[1]=T ri[L].Line[1].Bor[1];
Tri[L].Bor[2]= Tri[L].Line[2].Bor[1]。
3.7 对该边扩展所形成的三角形处理完毕,令 o=o+3;
3.8 若不能任何候选点,则完善 K+1 号三角形 Tri[K]的拓扑关系。Tri[K].Bor[1]= - 1;
Tri[K].Line[0].Bor[2]= - 1。
5. K+1 号三角形 Tri[K]扩展完成之后,再采用同样的方法对第二、第三边进行扩展。此处
应当特别注意:在构建拓扑关系时,要特别注意记录顺序,保证所有的信息的记录都是
按照顺时针或者逆时针来进行的。
6. 每当形成一个新的三角形时,L=L+1。
7. 当 K 号三角形的三条边都扩展完成之后(对于区域边界上的边来说没有采样点供扩展
之用,因此这样的情况也算已经被扩展了,或者给出相应标记),K=K+1,在转向下一
个三角形进行扩展。
8. 当 K=L 时,三角网构建完成。
剩余24页未读,继续阅读
资源评论
- lmy超可爱2018-05-29请问可以发一下项目文件么WGS08062019-03-01不好意思,看到的太晚了。程序也已经上传了。
- DCxiaocai2018-04-20您好!请问TIN离散点文件如何组织的?
- sampson372018-02-08只有一个pdf文档
WGS0806
- 粉丝: 20
- 资源: 35
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功