• 沒有找到結果。

3. 架構與實作

3.3 Divide-and-Conquer Delaunay 三角形分割

3.3.2 增進效能的設計

對資料節點排序,不僅是 divide-and-conquer Delaunay 三角形分割的必要 步驟,更能提供許多增進效能的設計,以減少程式執行的時間。在本節中,我們 提出一些 Stella 網格生成演算法中增進效能的設計,這些設計雖然無法改變 divide-and-conquer Delaunay 三角形分割演算法的時間複雜度,但能縮短數倍程 式執行的時間,在實際應用上很有幫助。

在Guibas和Stolfi提出的divided-and-conquer Delaunay三角形分割演算法

中 [5],遞迴分割的步驟直到分割後的小區域中,節點的數量少於四個,才會停 止。然而,在Stella的實作中,若一個區域中的節點全部在同一條直線上,或節 點的數量少於四個,分割的動作都會停止,並在該區域生成網格。在一些情況中,

例如:同一分割區域的節點都在同一直線上,這樣的改進可以較早結束分割的動 作,並開始生成區域網格,增進程式的效率。

另外,Delaunay三角形分割的過程中,常常需要檢查形成的三角形網格是否 覆蓋住其他的節點。如果每一次形成一個新的三角形網格,都要去檢查所有節點 是否在此三角形網格之內,這是浮點數乘法運算,相當費時。排序的節點,可以 提供一個快速的方法做這項檢查,使檢查節點是否在此三角形網格之內做浮點數 運算時間的次數和時間從 (其中,n為網格節點的數量)減至常數時間。假想 一個矩型,長含寬分別沿著x方向和y方向,外接於欲檢查的三角形,只有矩型內 的節點才可能在三角形之內,由於節點已排序,要找出在此矩型內的節點非常快。

) (n O

圖 5-12所示,假設欲檢查一個連接節點(24,33,82)的三角形是否覆蓋到其他節 點,所有的節點已經沿著x座標排序過,因此不需考慮順序在節點 24 之前及節點 33 之後的所有節點。如圖 5-12上圖所示,除了x座標在點 24 到點 33 之間的節點 以外,其他節點全部蓋住不看。剩下來的節點,只考慮y座標介於點 33 和點 82 的 y座標間的節點,在圖 5-12下圖中,只需要計算ID為 29,81,85 這三個點是否在三 角形(24,33,82)之中。不管全部網格的數量有多少,需要真正經過浮點數計算才 能決定是否在一個三角形網格內部的節點其實非常少。

類似的做法,也可應用於檢查一個邊是否與其他邊相交。假想一個矩型,長 含寬分別沿著x方向和y方向,外接於欲檢查的邊(即此邊為假想矩型的對角線之 一)。只有通過假想矩型的邊才可能與此邊相交,如圖 5-13所示。由於節點已經 排序,要找出可能相交的候選邊(candidates)只需要檢查此邊兩端點的順序。

以圖 5-13為例,只有通過假想矩型的候選邊e2 和e3 需要經過浮點數運算來決定 是否與邊e1 相交。

圖 5-12:檢查三角形(24,33,82)內是否含有非其頂點的節點(圖中數字為節點的 ID)

圖 5-13:產生一個新邊 e1 時要檢查其是否與其他邊相交,e2 和 e3 可能與 e1 相交的邊

表格 5-3:比較檢查所有邊和檢查部分邊,Delaunay 三角形分割所需的時間。

Number of meshed vertices

A. Execution time for checking all edges (s)

B. Execution time for only checking part of the edges (s)

表格 5-3中,比較上述改進前後,Delaunay三角形分割所需的計算時間。由實 驗結果看,整個Delaunay三角形分割所需的時間可以因此改進減至原來的 1/3 到 1/10,而且,節點的數量越多,節省的時間也越多。

e1 Candidate edges

e2 and e3

e3 e2

相關文件