weiler
-atherton
任意多邊形裁剪
sutherland
-hodgeman
演算法解決了裁剪視窗為凸多邊形視窗的問題,但一些應用需要涉及任意多邊形視窗(含凹多邊形視窗)的裁剪。
weiler-atherton
多邊形裁剪演算法正是滿足這種要求的演算法。
一
、weiler
-atherton
任意多邊形裁剪演算法描述:
在演算法中,裁剪視窗、被裁剪多邊形可以是任意多邊形:凸的、凹的(內角大於
180o
)、甚至是帶有內環的(子區),見下圖。
裁剪視窗和被裁剪多邊形處於完全對等的地位,這裡我們稱:
1、被裁剪多邊形為主多邊形,記為a;
2、裁剪視窗為裁剪多邊形,記為b。
主多邊形
a和裁剪多邊形
b的邊界將整個二維平面分成了四個區域:1、
a∩b(交:屬於
a且屬於
b); 2、
a-b(差:屬於
a不屬於b);
3、b-
a(差:屬於
b不屬於a);
4、a∪
b(並:屬於
a或屬於
b,取反;即:不屬於
a且不屬於b)。
內裁剪即通常意義上的裁剪,取圖元位於視窗之內的部分,結果為a∩
b。外裁剪取圖元位於視窗之外的部分,結果為a-
b。觀察下圖不難發現裁剪結果區域的邊界由被裁剪多
邊形的部分邊界和裁剪視窗的部分邊界兩部分構成,並且在交點處邊界發生交替,即由被裁剪多邊形的邊界轉至裁剪視窗的邊界,或者反之。由於多邊形構成乙個封閉的區域,所以,如果被裁剪多邊形和裁剪視窗有交點,則交點成對出現。這些交點分成兩類:
一類稱「入」
點,即被裁剪多邊形由此點進入裁剪視窗,如圖中a、
c、e;
一類稱「出」
點,即被裁剪多邊形由此點離開裁剪視窗,如圖中b、
d、f。
二
、weiler
-atherton
任意多邊形裁剪演算法思想:
假設被裁剪多邊形和裁剪視窗的頂點序列都按順時針方向排列。當兩個多邊形相交時,交點必然成對出現,其中乙個是從被裁剪多邊形進入裁剪視窗的交點,稱為「入點
」,另乙個是從被裁剪多邊形離開裁剪視窗的交點,稱為「出點
」。演算法從被裁剪多邊形的乙個入點開始,碰到入點,沿著被裁剪多邊形按順時針方向蒐集頂點序列;
而當遇到出點時,則沿著裁剪視窗按順時針方向蒐集頂點序列。
按上述規則,如此交替地沿著兩個多邊形的邊線行進,直到回到起始點。這時,收集到的全部頂點序列就是裁剪所得的乙個多邊形。
由於可能存在**的多邊形,因此演算法要考慮:將蒐集過的入點的入點記號刪去,以免重複跟蹤。將所有的入點蒐集完畢後演算法結束。
三、
weiler
-atherton
任意多邊形裁剪演算法步驟:
1、順時針輸入被裁剪多邊形頂點序列ⅰ放入陣列1中。
2、順時針輸入裁剪視窗頂點序列ⅱ放入陣列2中。
3、求出被裁剪多邊形和裁剪視窗相交的所有交點,並給每個交點打上「入
」、「出
」標記。
然後將交點按順序插入序列ⅰ得到新的頂點序列ⅲ,並放入陣列3中;
同樣也將交點按順序插入序列ⅱ得到新的頂點序列ⅳ,放入陣列4中;
4、初始化輸出陣列
q,令陣列
q為空。接著從陣列
3中尋找「入
」點。 如果
「入」點沒找到,程式結束。 5
、如果找到「入
」點,則將「入
」點放入
s中暫存。 6
、將「入」
點錄入到輸出陣列
q中。並從陣列
3中將該「入
」點的「入
」點標記刪去。 7
、沿陣列
3順序取頂點:
如果頂點不是「出點
」,則將頂點錄入到輸出陣列
q中,流程轉第7步。
否則,流程轉第8步。
8、沿陣列
4順序取頂點:
如果頂點不是「入點
」,則將頂點錄入到輸出陣列
q中,流程轉第8步。
否則,流程轉第9步。
9、如果頂點不等於起始點
s,流程轉第
6步,繼續跟蹤陣列3。
否則,將陣列
q輸出;
流程轉第
4步,尋找可能存在的**多邊形。
演算法在第
4步:滿足「入
」點沒找到的條件時,演算法結束。演算法的生成過程見下圖所示。
四、
weiler
-atherton
任意多邊形裁剪演算法特點:
1、裁剪視窗可以是矩形、任意凸多邊形、任意凹多邊形。 2
、可實現被裁剪多邊形相對裁剪視窗的內裁或外裁,即保留視窗內的圖形或保留視窗外的圖形,因此在三維消隱中可以用來處理物體表面間的相互遮擋關係。 3
、裁剪思想新穎,方法簡潔,裁剪一次完成,與裁剪視窗的邊數無關。
五、
weiler
-atherton
任意多邊形裁剪演算法小結:
前面介紹的是內裁演算法,即保留裁剪視窗內的圖形。而外裁演算法(保留裁剪視窗外的圖形)同內裁演算法差不多。
外裁演算法與內裁演算法不同的是:
1、從被裁剪多邊形的乙個「出點
」開始,碰到出點,沿著被裁剪多邊形按順時針方向蒐集頂點序列; 2
、而當遇到「入點
」時,則沿著裁剪視窗按逆時針方向蒐集頂點序列。
按上述規則,如此交替地沿著兩個多邊形的邊線行進,直到回到起始點為止。這時,收集到的全部頂點序列就是裁剪所得的乙個多邊形。
由於可能存在**的多邊形,因此演算法要考慮:將蒐集過的「出點
」的出點記號刪去,以免重複跟蹤。將所有的出點蒐集完畢後演算法結束。
weiler
-atherton
演算法的的設計思想很巧妙,裁剪是一次完成,不象
sutherland-hodgman
多邊形裁剪演算法,每次只對裁剪視窗的一條邊界及其延長線進行裁剪,如裁剪視窗有
n條邊,則要呼叫n次
s-h演算法後才能最後得出裁剪結果。 但
weiler
-atherton
演算法的程式設計實現比
sutherland-hodgman
演算法稍難,主要難在入、出點的查尋以及跨陣列搜尋上。
六、未測試的**(正確**見以後更新)
多邊形裁剪
如果按線段的方法裁剪,得到的是一系列線段。而實際上,應該得到的是下圖所示的有邊界的區域 多邊形裁剪演算法的輸出應該是裁剪後的多邊 形邊界的頂點序列!需要構造能產生乙個或多個封閉區域的多邊 形裁剪演算法 該演算法的基本思想是將多邊形邊界作為乙個整體,每次用視窗的一條邊對要裁剪的多邊形和中間結果多邊形進...
多邊形裁剪問題
案例 用乙個矩形框裁剪乙個多邊形。思路 將問題降到邊切割邊的問題。霍格曼演算法 h 遍歷 裁剪多邊形的每一條邊,每一條邊向兩邊無限延長,依次分割多邊形。遍歷被裁剪多邊形的每條邊 2條邊的位置關係比較明確。當被裁剪多邊形一條邊 起點p,終點q 相對於視窗某條邊界及其延長線進行剪裁時,共有四種情況 1 ...
Weiler Atherton多邊形裁剪演算法
這是乙個通用的多邊形裁剪演算法,既可以裁剪凸多邊形也可以裁剪凹多邊。通過下圖來描述演算法的執行過程 圖中dcba為裁剪視窗,dcba為要裁剪的多邊形。在演算法執行之前將多邊形和裁剪視窗的交點分別加入他們的頂點序列。即圖中的123456。則多邊形序列為 a,6,5,d,4,3,c,2,b,1 裁剪視窗...