当前位置:文档之家› 三角网算法

三角网算法

三角网算法(2010-11-15 10:54:01)原作:Paul Bourke / 1989.1 翻译:robter_x原文出处:.au/~pbourke/terrain/triangulate/这是一个适用于地形模型的三角网算法。

摘要(略)介绍有很多技术能够应用于表面插值,也就是说,已知一些采样点高度,求与这些采样点接近的某点的高度。

一些常用的方法是邻接插值,表面补丁,二次曲面,多边形插值,样条插值和下面将要描述的丹尼三角网(Delauney Triangulation)。

一些插值方法经常应用于经验数据的显示,例如,地形模型中的原始数据来源于调查,气象中心的气象分析数据,或有限元分析筛选出的数据等。

这篇文章讨论的技术不仅适用于地形模型,而且适用于其它方面,这个技术具有下列特点有一些地方的采样点密度高,而另一些地方的采样点密度低。

例如,在地形模型中,一般水边界的内部的采样点呈低密度分布,而在一些较复杂的地方,采样点呈高密度分布。

由于地形表面的不连续,导致采样平面上的采样点较密集。

这些可能是自然情况,如,悬岩和河岸,也可能是人工制造的不连续,如围墙。

很多平滑方法不能很好的处理这种情况,特别是那些基于多边形的函数将导致表面尖突,摆动和不稳定。

采样点经常沿着等值线分布,这是由于采样点的来源可能是等值线图或者地质调查组的实际勘探。

这是导致采样点密度不一致的另一个原因。

沿着采样点曲线有较高的采样点密度,而与采样点曲线垂直的路径,除非遇到另一条采样点曲线,否则,没有采样点。

经常需有处理大量的采样点。

对一个适用的技术来说,随着采样点数量的增加,处理采样所需的时间应该适度的增加。

典型的采样点数量一般是100~100000,对于一个自动化的取样方法来说,通常会有这么大数量的采样点。

获得的采样点一般是逐步增多的。

最初获得的采样点被分析,对于感兴趣的地方可能会增加采样密度。

很显然,在分析结果上增加一些新的采样点来进一步分析比对所有的采样点重新分析要有利。

算法应该适合在普通的台式机上运行,这些台式机不可能有大量的内存,磁盘空间和高速处理器。

这儿讨论的技术已经成功的应用于地形模型,它处理了地形数据所涉及的上述几个方面,并且能很容易的导出网格和产生等值线。

三角剖分三角剖分是指把一系列采样点划分为不覆盖的有边界的三角形区域,三角形的顶点是已知的采样点。

已被提出的三角剖分算法有很多种,而最流行的算法是径向扫描算法和用来实现丹尼三角网的Watson算法。

丹尼三角网在几何学上是与Direchlet网格密切相关的,而Direchlet网格又被称作Voronoi or Theissen网格。

这些网格把平面划分为许多多边形区域,每一个多边形区域内有一个采样点,这个采样点称作发生点,而在这个多边形区域中的所有的其它点都与发生点较接近。

把共用同一个边的邻接多边形的发生点连接起来形成丹尼三角网。

这样连接之后,三角形的边垂直平分多边形的边。

图一丹尼三角网(细线)通过9个发生点与Direchlet网格(粗线)关联,三角网的边垂直正交多边形的边。

在多边形内的点与这个多边形的发生点较接近,而与其它发生点较远。

这样的三角网有一些满足要求的特征。

三角形的三条边尽可能的相等,从而避免尖锐三角形的出现。

除了个别情况,通过这种方法得到的三角网是唯一的(即不管采样点如何排列)。

一个个别情况的例子是:四个点位于矩形的四个角上,它们只能用两种方法来进行三角剖分。

这种情况在实际数据中很少碰到,如果觉得唯一性更重要,可以对这四个点中的一个或多个点施加一些微小的位移。

有一种使用其它技术效果不太好的独特的情况,就是采样点密度不一致的区域混合在一起的情况。

基于这个方法的三角剖分很好的解决了这种情况,对高密度采样点区域划分了更多的三角形,因此,也更详细,而对低密度采样点区域划分较少的三角形,因此,没有这么详细。

不连续区域的处理是十分自然的。

不连续区域能尽可能的窄,这完全取决于采样要求,它仅仅是导致了几近直角的三角形的出现。

然而,请注意,除非有特别的操作,否则,采样平面上不应该有两个完全重叠的采样点,除非这两个采样点有不同的海拔高度。

这种情况可能发生在数字化相距很近的不连续区域时获得的离散点。

解决这个问题的方法是给这个采样点在正确的方向上施加一些微小的位移。

实现这种三角剖分的算法是十分高效的,并且对含有大量采样点的区域是十分合适的。

如果以后获得了更多的采样点,可以把这些新获得的采样点添加到已经计算好的三角网中,而不用对所有的采样点进行重新三角剖分。

这使得可以用一种高效可能的方法对一个区域进行更加详细的剖分。

形成的平面可以作为进一步形成平面的多边形使用,或者也可以用一种规则网格产生采样点。

给出包含多边形的一系列三角形是一件简单的事,那就是找到一个多边形,它在采样平面上的投影包含指定的采样点。

多边形在网格点上交点就是高度值。

另一个求网格上点的值的方法是使用Direchlet网格而不是三角网格。

这就避免了第一种方法容易产生大角度和小角度的角的情况。

显然,这更吸引人,因为对应一个区域的网格影响采样点。

等值线图可以从三角网格或分布在矩形网格中的采样点直接产生。

如果能获得网格数据,则产生平滑的表面也是比较容易的。

(译者注:本段表达不清楚,但不影响算法的描述)算法在三角剖分过程中的任何一个阶段,需要有一个存在三角网,一个新的采样点被添加到这个存在的三角网中。

通过产生一个超级三角形来对这个处理过程初始化,这个超级三角形就是人工设定的包含所有采样点的三角形。

在三角剖分过程的最后,任何与超级三角形有共享边的三角形都将从三角形集合中删除。

图2a新的采样点被添加到存在的三角网中所有的三角形,如果它的外接圆包含了新添加的采样点,则对这些三角形作标记,这些已标记的三角形的外边形成一个包围多边形。

(三角形的外接圆是指三角形的三个顶点落在圆周上)。

图2b三角形的外接圆包含新的采样点,所有这些三角形的外边形成一个包围多边形在包围多边形内的三角形都被删除,新添加的采样点与包围多边形的外边形成新的三角形。

图2c新添加的采样点与包围多边形的外边形成新的三角形每增加一个点,就会增加两个三角形。

因此,三角形的总数是采样点总数的两倍。

(这个数量包含超级三角形,当与超级三角形有共享边的三角形删除之后,三角形的总数将减少,确切的数量依赖于采样点的分布)三角剖分的算法可以用以下伪代码描述。

subroutine triangulateinput : vertex listoutput : triangle listinitialize the triangle listdetermine the supertriangleadd supertriangle vertices to the end of the vertex listadd the supertriangle to the triangle listfor each sample point in the vertex listinitialize the edge bufferfor each triangle currently in the triangle listcalculate the triangle circumcircle center and radiusif the point lies in the triangle circumcircle thenadd the three triangle edges to the edge bufferremove the triangle from the triangle listendifendfordelete all doubly specified edges from the edge bufferthis leaves the edges of the enclosing polygon onlyadd to the triangle list all triangles formed between the point and the edges of the enclosing polygonendforremove any triangles from the triangle list that use the supertriangle verticesremove the supertriangle vertices from the vertex listend能用很多方法对上述代码进行优化以使它更有效率。

最有意义的改进是对采样点按某个坐标系排序,选择的坐标系应该包含大部分的采样点。

假如采样点按X轴排序,那么,只要某个采样点与某个三角形外接圆圆心的距离的X分量大于外接圆半径,则随后的采样点可以不再考虑这个三角形了,因为随后的采样点不会落在这个三角形的外接圆内。

通过这种方法改进的算法,其随采样点增加的复杂度为O(N^1.5)。

花费的时间相对来说不依赖于采样点的分布,在自然分布的情况,以及特殊情况,如正规化,统一化,等值线和网格分布下,花费的时间至多只有25%的偏差。

算法不要求有大量的内部存储空间,算法仅仅需要一个内部逻辑型数组,这个数组用来标记不需要考虑的三角形。

假如内存足够的话,可以保存每一个产生的三角形的外接圆中心和半径来提高速度,这样避免了在新添加采样点的情况下重新计算它们。

假如能为上述和其它增加速度的方法提供足够的内存,那么花费的时间和采样点的数量基本上呈线性关系。

图3和图4是两个运用上述算法模拟出的陆地表面的例子。

图3三角剖分的结果图4从三角网获得的没有边界的透视的网格表面参考文献1.G. Petrie and T.J.M KennieTerrain modelling in Survey and Civil Engineering.Computer Aided Design, Volume 19, number 4, May 1987.2.Sibson, R.A Brief History of Natural Neighbour Interpolation.In Barnett, V. Interpreting Multivariate Data,John Wiley & Sons, New York. 19813.McCullagh, M.J.Creation of Smooth Contours Over Irregularly Distributed DataUsing Local Surface Patches.Geographical Analysis, Vol 13, number 1, January 1981.4.Akima, N..A Method of Bivariate Interpolation and Smooth Surface Fittingfor Irregularily Distributed Data Points.ACM Transactions on mathematical Software. Volume 4, number 1,19785.Barnhill, R.E., Gregory, J.A.Polynomial Interpolation to Boundary Data on TrianglesMathematics of Computation, Number 29. 19756.Holroyd, M.T., Bhattacharya, B.K.Automatic Contouring of Geophysical Data Using Bicubic SplineInterpolation.Dept. of Energy, Mines, and Resources Publications.Geological Survey of Canada, 1970.7.Yoeli, P.,Computer Executed Interpolation of Contours into Arrays ofRandomly Distributed Height Points.Cartographer Journal, Volume 14, number 2, 1977.8.Mirante A., and Weingarten N.The Radial Sweep Algorithm for Constructing TriangulatedIrregular Networks.IEEE Computer Graphics and Applications, Vol 2, No 3, 19829.S.W.Sloan, G.T.HoulsbyAn Implementation of Watson's Algorithm for Computing 2-DDelauney Triangulations.Advanced Engineering Software, Volume 6, Number 4, 198410.Green P. J., Sibson R.Computing Dirichlet Tesselations in the Plane.The Computer Journal, Number 24, 198111.Ilfick, M. H.Contouring by Use of a Triangular Mesh.Cartographic Journal, Volume 16, pp 24-28, 197912.Bourke, P.D.A Contouring Subroutine.BYTE Magazine, June, 1987(如需转载,请保留文章的完整性)。

相关主题