文章目錄
一、點裁剪
對於點在窗口內的充分必要條件是:
滿足上述條件的不等式組的點應該在窗口內;
二、線段裁剪
2.1 基本概念
- 線段相對於該窗口的情況有
(1)線段全部位於窗口的內部(A);
(2)線段全部位於窗口外部(B、C);
(3)線段的中間部分在窗口內,而二端點在窗口外部(D);
(4)線段的一端在窗口內,而另一端在窗口外(E);
- 待裁剪線段和窗口的關係
(1)線段完全可見;
(2)顯然不可見 ;
(3)線段至少有一端點在窗口之外,但非顯然不可見;
2.2 直接求交算法
- 基本思想:判斷直線與窗口的位置關係,確定該直線是完全可見、部分可見或完全不可見,然後輸出處於窗口內線段的端點,並顯示此線段。
根據直線段和窗口的關係可知:
(1)整條線在窗口之內。此時,不需剪裁,顯示整條線段;
(2)整條線在窗口之外,此時,不需剪裁,不顯示整條線段;
(3)部分線在窗口之內,部分線在窗口之外。此時,需要求出線段與窗口邊界的交點,並將窗口外的線段部分剪裁掉,顯示窗口內的部分;
2.3 Cohen-Sutherland 算法
- 基本思想:對於每條待裁剪的線段分三種情況處理:
(1)若完全在窗口內,則顯示該線段,簡稱“取”之;
(2)若完全在窗口外,則丟棄該線段,簡稱“舍”之;
(3)若線段既不滿足“取”的條件,也不滿足“舍”的條件,則求線段與窗口邊界的交點,在交點處把線段分爲兩段,其中一段完全在窗口外,可捨棄之,然後對另一段重複上述處理。 - 編碼原則:圖形區域劃分成九個區域,四位編碼表示端點所處的位置。
(1)第一位爲“1”時,表示點在的上方;
(2)第二位爲“1”時,表示點在的下方;
(3)第三位爲“1”時,表示點在的右方;
(4)第四位爲“1”時,表示點在的左方;
-
算法步驟
(1)第一步 判別線段兩端點是否都落在窗口內,如果是,則線段完全可見;否則進入第二步;
(2)第二步 判別線段是否爲顯然不可見,如果是,則裁剪結束;否則進行第三步;
(3)第三步:求線段與窗口邊延長線的交點,這個交點將線段分爲兩段,其中一段顯然不可見,丟棄。對餘下的另一段重新進行第一步,第二步判斷,直至結束; -
編碼判斷
對一條線段的可見性測試方法:
(1)若線段兩個端點的四位二進制編碼全爲0000,即兩端點編碼邏輯或運算爲0,那麼該線段完全位於窗口內,可直接保留;
(2)對兩端點的四位二進制編碼進行邏輯與運算,若結果不爲零,那麼整條線段必位於窗口外,可直接捨棄;
(3)否則,這條線段既不能直接保留,也不能直接捨棄,它可能與窗口相交。此時,需要對線段進行再分割,即找到與窗口邊線的一個交點,根據交點位置,賦予四位二進制編碼,並對分割後的線段按照一定的順序(如左右下上)進行檢查,決定保留、捨棄或再次進行分割。重複這一過程,直到全部線段均被捨棄或保留爲止。
三、多邊形裁剪
3.2 Sutherland-Hodgman算法
- 思路:用窗口的四條邊所在的直線依次裁剪多邊形。窗口的每條邊所在直線將二維平面分成兩部分,包含窗口一部分爲內側,稱爲可見側,另一部分不包含窗口,稱爲外側,稱不可見側。
以窗口左邊界爲例我們看一下四種情況如何進行處理。假設當前處理的多邊形的邊爲SP;
- 栽剪過程
(1)使用左邊栽剪,計算以及與左邊框的交點和。保留可見側和並重新編號各頂點,得到裁剪結果(a)
(2)使用上邊栽剪,計算以及與上邊框的交點和。保留可見側和並重新編號各頂點,得到裁剪結果(b)
(3)使用右邊栽剪,計算以及與上邊框的交點和。保留可見側和並重新編號各頂點,得到裁剪結果(c)
(4)使用下邊栽剪,計算以及與上邊框的交點和。保留可見側和並重新編號各頂點,得到裁剪結果(d)
(5)依次連接各頂點得到栽剪完的多邊形(e)
- 特點:裁剪算法採用流水線方式,適合硬件實現,可推廣到任意凸多邊形裁剪窗口;
- 問題:一個凹多邊形可能被裁剪成幾個小的多邊形,如何確定這些小多邊形的邊界?
輸入頂點BAFEDC,輸出頂點:V1 A V2 V3 E D V4
3.3 Weiler-Athenton算法
- 裁剪窗口爲任意多邊形(凸、凹、帶內環)的情況;
- 原理:可以用一個有內孔的凹多邊形去裁剪另一個也有內孔的凹多邊形。各多邊形的外部邊界取順時針方向,而其內部邊界或孔取逆時針方向。因此,沿多邊形的一條邊走動,其右邊爲多邊形的內部。
- 基本概念:
(1)被裁剪的多邊形稱爲主多邊形 PS;
(2)裁剪窗口稱爲裁剪多邊形 PW;
(3)主多邊形和裁剪多邊形的邊界若相交,交點必定成對地出現,其中一個交點爲主多邊形邊進入裁剪多邊形內部時的交點(稱進點),另一個交點則爲離開時的交點(稱出點)。這兩類交點分別用進點表和出點表來存放。 - 思想:從Ps的任一頂點出發,跟蹤檢測PS的每一條邊,當PS與Pw的有效邊相交時,按如下規則處理:
(1)若Ps的邊進入Pw,則輸出可見直線段,沿Ps的邊繼續。
(2)若Ps的邊從Pw出來, Ps與Pw交點爲前交點,輸出Ps中到前交點的可見部分,從前交點開始,沿窗口邊界順時針檢測Pw的邊,找到Ps與Pw最靠近前交點的新交點,同時輸出由前交點以此新交點這間窗邊上的線段。
(3)返回前交點,再沿Ps處理各條邊,直到處理完Ps的所有邊,回到起點爲止。 - 交點的奇異情況處理
(1)與裁剪多邊形邊重合的主多邊形的邊不參與求交點;
(2)對於頂點落在裁剪多邊形的邊上的主多邊的邊,如果落在該裁剪邊的內側,將該頂點算作交點;而如果這條邊落在該裁剪邊的外側,將該頂點不看作交點
四、字符裁剪方法
4.1 字符的裁剪
- 簡單裁剪方法:用點陣字符的掩膜或矢量字符的網格大小作爲字符的包圍框,若該包圍框在窗口內,則顯示字符;否則,不予顯示。
- 精確裁剪方法:對於點陣字符,判斷組成其筆畫的每個像素點是否位於窗口內。對於矢量字符,對組成其筆畫的每條線段進行裁剪。
4.2 字符串的剪裁
字符串剪裁3種可選擇的方法。
- 串精度裁剪
- 字符精度裁剪
- 字符的精密(筆畫、像素精度)剪裁
4.3 凸包
- 引入:爲了減少計算量,在進行真正的求交計算之前,往往先用凸包等輔助結構進行粗略地比較,排除那些顯然不相交的情形。
2.定義:一個圖形的凸包,就是包含這個圖形的凸區域(凸多邊形、凸多面體),它不是唯一的。