計算幾何中的掃描(sweeping)算法(轉自百度)


要解決的問題是判斷一大堆線段中是否存在一對線段相交。

個人感覺計算幾何的掃描算法算是屬於解題思想上的東西,類似常規問題的搜索,是遍歷處理對象的一種方法。

算法的思想是安照某種方式組織要被處理的對象,比如點、線段。組織方式通常就是從上到下、從左到右等。具體的辦法是假想一條掃描線,並按某個方向(如X座標的從小到大)依次移動它,在移動的每一步裏執行自己的處理語句。


掃描算法所要維護的兩個數據結構:

a. 事件點序列。也就是移動的每一步的“步”。

b. 掃描線狀態。在每一步中,處於掃描線上的對象。


但是具體到本問題,實現細節上用到了紅黑樹存掃描線狀態(一個全序T),紅黑樹沒看過,不懂。關鍵是:

取所有線段的所有端點爲事件點,按從左到右一級、從下到上二級排序,即爲事件點序列。

在每一點上,判斷當前點P:如果爲某線段s的左端點,則取掃描線上位於s前面(ABOVE)的線段s1s做相交判斷,若相交,over;再取掃描線上s位於後面(BELOW)的線段s2s做相交判斷,同上。都不行的話插入s到掃描線狀態中。如果P爲某個s的右端點,仍取s1s2,判斷s1s2是否相交,是的話over,否則從掃描線中刪除s

本質上講,就是依次判斷所有可能相交的線段是否相交。但關鍵就是這個判斷次序、遍歷方式。

爲什麼用紅黑樹?因爲這裏所涉及的操作,插入、刪除、ABOVEBELOW操作用紅黑樹的話都是logn的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章