凸包
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
姓名:张晖
班级:地信1002
学号:201001136 指导:刘少华老师
2013.4.17
基于凸包的三角网算法
一,实验背景
数字地形模型是针对地形地貌的一种数字建模,这种建模的结
果通常就是一个数字高程模型(DEM)。不规则三角网(TIN)
模型是DEM中存储和表示非规则数据的理想模型,它既减少
规则网格方法造成的数据冗余,同时在计算效率方面又优于
纯粹基于等高线的方法,所以寻求一种好的TIN算法更能快
速逼真的显示与模拟出地貌三维信息。在所有可能的三角网
中,Delaunay三角网在地形拟合方面表现最为出色,因此常
常用于TIN的生成。
二,实验目的
1,了解TIN的算法种类及各算法特点,尤其是对三角网生长
算法的了解与掌握
2,根据基于凸包的三角网算法,应用C#编写一个自动生成三
角网的程序。
3,学生熟练掌握C#的使用。
三,实验内容
1. 查找关于三角网生成算法的论文,了解与掌握其要义。
2. 分析与研究三角网生成算法
3. 选择一种算法实现三角网的生成(三角网生长算法)
4. 选择一种语言编写三角网的生成代码(C#)
四,算法简介
(1)凸包生成。①求出点集中满足min(x-y)、min(x+y)、max(x-y)、max(x+y)的四个点,并按照逆时针方向组成一个链表。这四个点是离
散点中与包含离散点的外接矩形的四个角点最接近的点,这四个点构成
的多边形作为初始凸包。
②对于每个凸包上的点I,设它的后续点为J,计算矢量线段IJ右侧的所有
点到IJ的距离,求出距离最大的点K。
③将K插入I、J之间,并将K赋给J。
④重复②、③步,直到点集中没有在线段IJ右侧的点为止。
⑤将J赋给I,J取其后续点,重复②、③、④步。
⑥当凸包中任意相邻两点连线的右侧不存在离散点时,结束点集凸包求取
过程。
完成这一步后,形成了包含所有离散点的多边形(凸包)。
(2)环切边界法凸包三角剖分。在凸包链表中每次寻找一个由相邻两条凸包边组成的三角形,在该三角形的内部和边界上都不包含凸包上的任何
其他点。将这个点去掉后得到新的凸包链表。重复这个过程,直到凸包
链表中只剩下三个离散点为止。将凸包链表中的最后三个离散点构成一
个三角形,结束凸包三角剖分过程。
完成这一步后,将凸包中的点构成了若干Delaunay三角形。
(3)离散点内插。在对凸包进行三角剖分之后,不在凸包上的其余离散点,可采用逐点内插的方法进行剖分。其基本过程为:
①找出外接圆包含待插入点的所有三角形,构成插入区域。
②删除插入区域内的三角形公共边,形成由三角形顶点构成的多边形。
③将插入点与多边形所有顶点相连,构成新的Delaunay三角形。
④重复①、②、③,直到所有非凸壳离散点都插入为止。
完成这一步,就完成了Delaunay三角网的构建。
五,源代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
namespace TINProject
{
class CPoint
{
public int id;
public float x, y;
public CPoint()
{ id = 0; }
}
class CEdge
{
public int id;
public int[] pid;
public int[] tid;
public CEdge()
{
id = 0;
pid = new int[2];
tid = new int[2];
}
}
class CTriangle
{
public int id;
public int[] pid;
public int[] eid;
public CTriangle()
{
id = 0;
pid = new int[3];
eid = new int[2];
}
}
class CTin
{
public List
public List
public List
public List
public CTin()
{
_PntsAry = new List
_EdgesAry = new List
_TrianlgesAry = new List
_TuBaoAry = new List
}
public bool IsRightInLine(CPoint p1, CPoint p2, CPoint p)