Delaunay 三角剖分 和 Voronoi diagram(泰森多边形)

首先看一下 Delaunay 三角剖分。

在计算机几何图像显示上,为了追求效率,GPU只会绘制三角形。opengl 在绘制凸多边形的时候,也

是简单的将多边形化成三角形在渲染。当你给的是一个凹多边形的时候,问题就出现了,OGL渲染的不对。

这个时候,我们就要把数据自己处理成成一个个三角形,这里就要用到三角剖分。

首先看广义的三角剖分:

三角剖分 [1]   :假设V是二维实数域上的有限点集,边e是由点集中的点作为端点构成 的封闭线段, E为e的集合。
那么该点集V的一个三角剖分T=(V,E)是一个平面图G,该平面 图满足条件:
1.除了 端点,平面图中的边不包含点集中的任何点。
2.没有相交边。
3.平面图中所有的面都是三角面,且所有三角面的合集是散点集V的 凸包
然后看看Delaunay 三角剖分:
在实际中运用的最多的三角剖分是Delaunay三角剖分,它是一种特殊的 三角剖分 。先从Delaunay边说起:
Delaunay边:假设E中的一条边e(两个端点为a,b),e 若满足下列条件,则称之为Delaunay边:存在一
个圆经过a,b两点,圆内(注意是圆内,圆上最多三点共圆)不含点集V中任何其他的点,这一特性又称空圆特性。
Delaunay三角剖分:如果点集V的一个三角剖分T只包含Delaunay边,那么该三角剖分称为Delaunay三角剖分。
其实就是说,三个点连城的三角形有一个外接圆,然后其他的离散点不在这个外接圆内。
现在知道了三角剖分,我们就可以把手上的凹多边形数据,处理成很多个三角形数据,然后让GL去渲染。现在
三角剖分算法很多, Poly2Tri 这个算法的时间复杂度好像表现很好,这里给个链接,里面的博主推荐了几个算法。
http://blog.csdn.net/yqxx/article/details/6318679
但是这些算法有部分有个问题,我做GIS遇到的,当地图的缩放级别很大的时候,那么地图上的点,投射到屏幕上
就很近,近到算法认为这是两个相同的点,算法自身限制了,不允许相同的点输入,然后就崩溃了。也有的不奔溃,
但是对于这样的情况,三角剖分出来的结果出问题。然后我最近有看到了一个C/C++的几何空间处理库,GEOS,比
较大,而且不好学。选取工具的时候,自己衡量一下。
下面就是,泰森多边形。
泰森多边形是建立在Delaunay上的。只有上一步,Delaunay了之后,才能进行。
下面是步骤。
1、 离散点自动构建 三角网,即构建Delaunay 三角网。对 离散点和形成的三角形编号,记录每个三角形是由哪三个 离散点构成的。
2、找出与每个 离散点相邻的所有三角形的编号,并记录下来。这只要在已构建的 三角网中找出具有一个相同顶点的所有三角形即可。
3、对与每个 离散点相邻的三角形按顺时针或逆时针方向排序,以便下一步连接生成泰森多边形。设 离散点为o。找出以o为顶点的一个三角形,设为A;取三角形A除o以外的另一顶点,设为a,则另一个顶点也可找出,即为f;则下一个三角形必然是以of为边的,即为三角形F;三角形F的另一顶点为e,则下一三角形是以oe为边的;如此重复进行,直到回到oa边。
4、计算每个三角形的 外接圆 圆心,并记录之。
5、根据每个 离散点的相邻三角形,连接这些相邻三角形的 外接圆 圆心,即得到泰森多边形。对于 三角网边缘的泰森多边形,可作 垂直平分线与图廓相交,与图廓一起构成泰森多边形。
总结就是,对
1、 离散点自动构建 三角网,即构建Delaunay 三角网。对 离散点和形成的三角形编号,记录每个三角形是由哪三个 离散点构成的。
2、找出与每个 离散点相邻的所有三角形的编号,并记录下来。这只要在已构建的 三角网中找出具有一个相同顶点的所有三角形即可。
3、对与每个 离散点相邻的三角形按顺时针或逆时针方向排序,以便下一步连接生成泰森多边形。设 离散点为o。找出以o为顶点的一个三角形,设为A;取三角形A除o以外的另一顶点,设为a,则另一个顶点也可找出,即为f;则下一个三角形必然是以of为边的,即为三角形F;三角形F的另一顶点为e,则下一三角形是以oe为边的;如此重复进行,直到回到oa边。
4、计算每个三角形的 外接圆 圆心,并记录之。
5、根据每个 离散点的相邻三角形,连接这些相邻三角形的 外接圆 圆心,即得到泰森多边形。对于 三角网边缘的泰森多边形,可作 垂直平分线与图廓相交,与图廓一起构成泰森多边形。 
总结就是 Delaunay出来的三角形,对边做垂直平分线,然后将这些交点连接,组成一个个多边形。特性就是
1、每个泰森多边形内仅含有一个 离散点数据;
2、泰森多边形内的点到相应离散点的距离最近;
3、位于泰森多边形边上的点到其两边的离散点的距离相等。
我能想到的应用就是根据基站规划区域。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值