首先看一下 Delaunay 三角剖分。
在计算机几何图像显示上,为了追求效率,GPU只会绘制三角形。opengl 在绘制凸多边形的时候,也
是简单的将多边形化成三角形在渲染。当你给的是一个凹多边形的时候,问题就出现了,OGL渲染的不对。
这个时候,我们就要把数据自己处理成成一个个三角形,这里就要用到三角剖分。
首先看广义的三角剖分:
那么该点集V的一个三角剖分T=(V,E)是一个平面图G,该平面
图满足条件:
1.除了
端点,平面图中的边不包含点集中的任何点。
2.没有相交边。
3.平面图中所有的面都是三角面,且所有三角面的合集是散点集V的
凸包。
然后看看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了之后,才能进行。
下面是步骤。
3、对与每个
离散点相邻的三角形按顺时针或逆时针方向排序,以便下一步连接生成泰森多边形。设
离散点为o。找出以o为顶点的一个三角形,设为A;取三角形A除o以外的另一顶点,设为a,则另一个顶点也可找出,即为f;则下一个三角形必然是以of为边的,即为三角形F;三角形F的另一顶点为e,则下一三角形是以oe为边的;如此重复进行,直到回到oa边。
总结就是,对
3、对与每个
离散点相邻的三角形按顺时针或逆时针方向排序,以便下一步连接生成泰森多边形。设
离散点为o。找出以o为顶点的一个三角形,设为A;取三角形A除o以外的另一顶点,设为a,则另一个顶点也可找出,即为f;则下一个三角形必然是以of为边的,即为三角形F;三角形F的另一顶点为e,则下一三角形是以oe为边的;如此重复进行,直到回到oa边。
总结就是
Delaunay出来的三角形,对边做垂直平分线,然后将这些交点连接,组成一个个多边形。特性就是