凸包

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 _PntsAry;

public List _EdgesAry;

public List _TrianlgesAry;

public List _TuBaoAry;

public CTin()

{

_PntsAry = new List();

_EdgesAry = new List();

_TrianlgesAry = new List();

_TuBaoAry = new List();

}

public bool IsRightInLine(CPoint p1, CPoint p2, CPoint p)

相关文档
最新文档