三角剖分算法的数学理解
生活随笔
收集整理的這篇文章主要介紹了
三角剖分算法的数学理解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.開篇
三角剖分是代數拓撲學里最基本的研究方法。 以曲面為例, 我們把曲面剖開成一塊塊碎片,要求滿足下面條件: (1)每塊碎片都是曲邊三角形;? (2)曲面上任何兩個這樣的曲邊三角形,要么不相交,要么恰好相交于一條公共邊(不能同時交兩條或兩條以上的邊) 拓撲學的一個已知事實告訴我們:任何曲面都存在三角剖分。假設曲面上有一個三角剖分, 我們把所有三角形的頂點總個數記為p(公共頂點只看成一個,下同),邊數記為l,三角形的個數記為n,則e=p-l+n是曲面的拓撲不變量! 也就是說不管是什么剖分, e總是得到相同的數值。 e被稱為稱為歐拉示性數。
假設g是曲面上洞眼的個數(比如球面沒有洞,故g=0;又如環面有一個洞,故g=1),那么e=2-2g。
g也是拓撲不變量,稱為曲面的虧格(genus)。
上面例舉曲面的情形。對一般的拓撲對象(復形),我們有類似的剖分,通常成為單純剖分。 分割出的每塊碎片稱為單純形(簡稱單形)
2.拓撲理解
2.1 定義
三角剖分:假設V是二維實數域上的有限點集,邊e是由點集中的點作為端點構成的封閉線段, E為e的集合。那么該點集V的一個三角剖分T=(V,E)是一個平面圖G,該平面圖滿足條件:1.除了端點,平面圖中的邊不包含點集中的任何點。
2.沒有相交邊。
3.平面圖中所有的面都是三角面,且所有三角面的合集是散點集V的凸包。
在實際中運用的最多的三角剖分是Delaunay三角剖分,它是一種特殊的三角剖分。
2.2 先從Delaunay邊說起
Delaunay邊: 假設E中的一條邊e(兩個端點為a,b),e若滿足下列條件,則稱之為Delaunay邊: 存在一個圓經過a,b兩點,圓內(注意是圓內,圓上最多三點共圓)不含點集V中任何其他的點,這一特性又稱空圓特性。Delaunay三角剖分: 如果點集V的一個三角剖分T只包含Delaunay邊,那么該三角剖分稱為Delaunay三角剖分。
假設T為V的任一三角剖分,則T是V的一個Delaunay三角剖分,當前僅當T中的每個三角形的外接圓的內部不包含V中任何的點。?
通過離散點組成Delaunay三角模型如下圖所示:
3.Delaunary算法
關于Delaunay三角形的算法,有翻邊算法、逐點插入算法、分割合并算法、Bowyer-Watson算法等。而在這幾種算法中,逐點插入算法比較簡單、易懂,在本文中只針對該算法進行討論,該算法也是目前使用最為廣泛的Delaunay算法。
?
在該算法中,主要應用Delaunay三角形,理解下來就是每一個三角形的外接圓圓內不能存在點集內的其它任何一點,而有時候會出現點在外接圓上的情況,這種情況被稱為“退化”。
文章《Triangulate》對該方法進行了分析,并提出了偽代碼思路:
subroutine triangulate input : vertex list output : 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 list end其方法雖然可實現三角化,但是效率還是不太高。
在看過https://github.com/ironwallaby/delaunay該js也是基于該偽代碼進行編寫的,但是作者在其中進行了一次排序優化,使得代碼運行效率得到了提高
優化后的偽代碼為:
input: 頂點列表(vertices) //vertices為外部生成的隨機或亂序頂點列表 output:已確定的三角形列表(triangles)初始化頂點列表創建索引列表(indices = new Array(vertices.length))//indices數組中的值為0,1,2,3,.....,vertices.length-1基于vertices中的頂點x坐標對indices進行sort //sort后的indices順序為頂點坐標x從小到大排序本例針對x坐標)確定超級三角形將超級三角形保存至未確定三角形列表(temp triangles)將超級三角形push到triangles列表遍歷基于indices順序的vertices中每一個點 //基于indices后,則頂點則是由x從小到大出現初始化邊緩存數組(edge buffer)遍歷temp triangles中的每一個三角形計算該三角形的圓心和半徑如果該點在外接圓的右側則該三角形為Delaunay三角形,保存到triangles并在temp里去除掉跳過如果該點在外接圓外(即也不是外接圓右側)則該三角形為不確定 //后面會在問題中討論跳過如果該點在外接圓內則該三角形不為Delaunay三角形將三邊保存至edge buffer在temp中去除掉該三角形對edge buffer進行去重將edge buffer中的邊與當前的點進行組合成若干三角形并保存至temp triangles中將triangles與temp triangles進行合并除去與超級三角形有關的三角形 end我們先用三點來做實例,具體的圖形化解釋如下所示: ? ? ?
根據離散點的最大分布來求得隨機一個超級三角形(超級三角形意味著該三角形包含了點集中所有的點)
我的方法是根據相似三角形定理求得與矩形一半的小矩形的對角三角形,擴大一倍后則擴大后的直角三角形斜邊經過點(Xmax,Ymin)
但是為了將所有的點包含在超級三角形內,在右下角對該三角形的頂點進行了橫和高的擴展,并要保證這個擴展三角形底大于高,才能實現包含。這樣求得的超級三角形不會特別大使得計算復雜,而且過程也簡單,并將超級三角形放入temp triangles中。
? ?
接下來就像是偽代碼中描述的那樣,對temp triangle中的的三角形遍歷畫外接圓,這時先對左邊的第一個點進行判斷,其在圓內。
所以該三角形不為Delaunay三角形,將其三邊保存至edge buffer中,temp triangle中刪除該三角形。
將該點與edge buffer中的每一個邊相連,組成三個三角形,加入到temp triangles中。
再將重復對temp triangles的遍歷并畫外接圓,這時使用的是第二個點來進行判斷
該點在三角形1外接圓右側,則表示左側三角形為Delaunay三角形,將該三角形保存至triangles中
該點在三角形2外接圓外側,為不確定三角形,所以跳過(后面會講到為什么要跳過該三角形),但并不在temp triangles中刪除
該點在三角形3外接圓內側,則這時向清空后的edge buffer加入該三角形的三條邊,并用該點寫edge buffer中的三角邊進行組合,組合成了三個三角形并加入到temp triangles中
再次對temp triangles進行遍歷,這里該數組里則含有四個三角形,一個是上次檢查跳過的含有第一個點的三角形和新根據第二個點生成的三個三角形
該點在三角形1外接圓右側,則該三角形為Delaunay三角形,保存至triangles中,并在temp triangles中刪除
該點在三角形2外接圓外側,跳過
該點在三角形3外接圓內側,將該三邊保存至temp buffer中,并在temp triangles中刪除
該點在三角形4外接圓內側,將該三邊保存至temp buffer中,并在temp triangles中刪除
這時,temp buffer 中有六條邊,triangles中有兩個三角形,temp triangles中有1個三角形
對temp buffer中的六條邊進行去重,得到五條邊,將該點與這五條邊組合成五個三角形并加入到temp triagnles 中,這時temp triangles中有6個三角形
由于三個點已經遍歷結束,到了不會再對第三個點形成的三角形做外接圓,這時則將triangles與temp trianlges合并,合并后的數組表示包含已經確定的Delaunay三角形和剩下的三角形
這時除去合并后數組中的和超級三角形三個點有關的所有三角形,即進行數組坐標限定,得到最后的結果:
這是用最少的三個點來做講解,點數越多的話計算量會越大,但是都是在上面步驟下進行的。
這里僅對三個點的特殊情況進行研究,多點情況類似。下面僅給出一張仿真圖作為結尾:
總結
以上是生活随笔為你收集整理的三角剖分算法的数学理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我们学过 飞鸽传书 的应该知道
- 下一篇: VTK修炼之道54:图形基本操作进阶_表