二維圖形裁剪

一、點裁剪

對於點P(x,y)P(x, y)在窗口內的充分必要條件是:
{WxlxWxrWylxWyr \begin{cases} W_{x_l}\leq x \leq W{x_r}\\ W_{y_l}\leq x\leq W{y_r} \end{cases}
滿足上述條件的不等式組的點應該在窗口內;

二、線段裁剪

2.1 基本概念

  1. 線段相對於該窗口的情況有
    (1)線段全部位於窗口的內部(A);
    (2)線段全部位於窗口外部(B、C);
    (3)線段的中間部分在窗口內,而二端點在窗口外部(D);
    (4)線段的一端在窗口內,而另一端在窗口外(E);
  1. 待裁剪線段和窗口的關係
    (1)線段完全可見;
    (2)顯然不可見 ;
    (3)線段至少有一端點在窗口之外,但非顯然不可見;

2.2 直接求交算法

  • 基本思想:判斷直線與窗口的位置關係,確定該直線是完全可見、部分可見或完全不可見,然後輸出處於窗口內線段的端點,並顯示此線段。
    根據直線段和窗口的關係可知:
    (1)整條線在窗口之內。此時,不需剪裁,顯示整條線段;
    (2)整條線在窗口之外,此時,不需剪裁,不顯示整條線段;
    (3)部分線在窗口之內,部分線在窗口之外。此時,需要求出線段與窗口邊界的交點,並將窗口外的線段部分剪裁掉,顯示窗口內的部分;

2.3 Cohen-Sutherland 算法

  1. 基本思想:對於每條待裁剪的線段P1P2P_1P_2分三種情況處理:
    (1)若P1P2P_1P_2完全在窗口內,則顯示該線段P1P2P_1P_2,簡稱“取”之;
    (2)若P1P2P_1P_2完全在窗口外,則丟棄該線段,簡稱“舍”之;
    (3)若線段既不滿足“取”的條件,也不滿足“舍”的條件,則求線段與窗口邊界的交點,在交點處把線段分爲兩段,其中一段完全在窗口外,可捨棄之,然後對另一段重複上述處理。
  2. 編碼原則:圖形區域劃分成九個區域,四位編碼CtCbCrClC_tC_bC_rC_l表示端點所處的位置。
    (1)第一位爲“1”時,表示點在y=yTy=y_T的上方;
    (2)第二位爲“1”時,表示點在y=yBy=y_B的下方;
    (3)第三位爲“1”時,表示點在x=xRx=x_R的右方;
    (4)第四位爲“1”時,表示點在x=xLx=x_L的左方;
  1. 算法步驟
    (1)第一步 判別線段兩端點是否都落在窗口內,如果是,則線段完全可見;否則進入第二步;
    (2)第二步 判別線段是否爲顯然不可見,如果是,則裁剪結束;否則進行第三步;
    (3)第三步:求線段與窗口邊延長線的交點,這個交點將線段分爲兩段,其中一段顯然不可見,丟棄。對餘下的另一段重新進行第一步,第二步判斷,直至結束;

  2. 編碼判斷
    對一條線段的可見性測試方法:
    (1)若線段兩個端點的四位二進制編碼全爲0000,即兩端點編碼邏輯或運算爲0,那麼該線段完全位於窗口內,可直接保留;
    (2)對兩端點的四位二進制編碼進行邏輯與運算,若結果不爲零,那麼整條線段必位於窗口外,可直接捨棄;
    (3)否則,這條線段既不能直接保留,也不能直接捨棄,它可能與窗口相交。此時,需要對線段進行再分割,即找到與窗口邊線的一個交點,根據交點位置,賦予四位二進制編碼,並對分割後的線段按照一定的順序(如左右下上)進行檢查,決定保留、捨棄或再次進行分割。重複這一過程,直到全部線段均被捨棄或保留爲止。

三、多邊形裁剪

3.2 Sutherland-Hodgman算法

  1. 思路:用窗口的四條邊所在的直線依次裁剪多邊形。窗口的每條邊所在直線將二維平面分成兩部分,包含窗口一部分爲內側,稱爲可見側,另一部分不包含窗口,稱爲外側,稱不可見側。
    在這裏插入圖片描述
    以窗口左邊界爲例我們看一下四種情況如何進行處理。假設當前處理的多邊形的邊爲SP;
    在這裏插入圖片描述
  2. 栽剪過程
    (1)使用左邊栽剪,計算P5P4P_5P_4以及P5P1P_5P_1與左邊框的交點I1I_1I2I_2。保留可見側I1P4I_1P_4I2P1I_2P_1並重新編號各頂點,得到裁剪結果(a)
    在這裏插入圖片描述
    (2)使用上邊栽剪,計算P0P5P_0P_5以及P5P4P_5P_4與上邊框的交點I1I_1I2I_2。保留可見側I1P0I_1P_0I2P4I_2P_4並重新編號各頂點,得到裁剪結果(b)
    在這裏插入圖片描述
    (3)使用右邊栽剪,計算P3P4P_3P_4以及P2P3P_2P_3與上邊框的交點I1I_1I2I_2。保留可見側I1P4I_1P_4I2P2I_2P_2並重新編號各頂點,得到裁剪結果(c)
    在這裏插入圖片描述
    (4)使用下邊栽剪,計算P1P2P_1P_2以及P2P3P_2P_3與上邊框的交點I1I_1I2I_2。保留可見側I1P1I_1P_1I2P3I_2P_3並重新編號各頂點,得到裁剪結果(d)
    在這裏插入圖片描述
    (5)依次連接各頂點得到栽剪完的多邊形(e)
    在這裏插入圖片描述
  3. 特點:裁剪算法採用流水線方式,適合硬件實現,可推廣到任意凸多邊形裁剪窗口;
  4. 問題:一個凹多邊形可能被裁剪成幾個小的多邊形,如何確定這些小多邊形的邊界?
    在這裏插入圖片描述
    輸入頂點BAFEDC,輸出頂點:V1 A V2 V3 E D V4

3.3 Weiler-Athenton算法

  1. 裁剪窗口爲任意多邊形(凸、凹、帶內環)的情況;
    在這裏插入圖片描述
  2. 原理:可以用一個有內孔的凹多邊形去裁剪另一個也有內孔的凹多邊形。各多邊形的外部邊界取順時針方向,而其內部邊界或孔取逆時針方向。因此,沿多邊形的一條邊走動,其右邊爲多邊形的內部。
  3. 基本概念:
    (1)被裁剪的多邊形稱爲主多邊形 PS;
    (2)裁剪窗口稱爲裁剪多邊形 PW;
    (3)主多邊形和裁剪多邊形的邊界若相交,交點必定成對地出現,其中一個交點爲主多邊形邊進入裁剪多邊形內部時的交點(稱進點),另一個交點則爲離開時的交點(稱出點)。這兩類交點分別用進點表和出點表來存放。
  4. 思想:從Ps的任一頂點出發,跟蹤檢測PS的每一條邊,當PS與Pw的有效邊相交時,按如下規則處理:
    (1)若Ps的邊進入Pw,則輸出可見直線段,沿Ps的邊繼續。
    (2)若Ps的邊從Pw出來, Ps與Pw交點爲前交點,輸出Ps中到前交點的可見部分,從前交點開始,沿窗口邊界順時針檢測Pw的邊,找到Ps與Pw最靠近前交點的新交點,同時輸出由前交點以此新交點這間窗邊上的線段。
    (3)返回前交點,再沿Ps處理各條邊,直到處理完Ps的所有邊,回到起點爲止。
  5. 交點的奇異情況處理 在這裏插入圖片描述
    (1)與裁剪多邊形邊重合的主多邊形的邊不參與求交點;
    (2)對於頂點落在裁剪多邊形的邊上的主多邊的邊,如果落在該裁剪邊的內側,將該頂點算作交點;而如果這條邊落在該裁剪邊的外側,將該頂點不看作交點

四、字符裁剪方法

4.1 字符的裁剪

  1. 簡單裁剪方法:用點陣字符的掩膜或矢量字符的網格大小作爲字符的包圍框,若該包圍框在窗口內,則顯示字符;否則,不予顯示。
  2. 精確裁剪方法:對於點陣字符,判斷組成其筆畫的每個像素點是否位於窗口內。對於矢量字符,對組成其筆畫的每條線段進行裁剪。

4.2 字符串的剪裁

字符串剪裁3種可選擇的方法。

  1. 串精度裁剪
  2. 字符精度裁剪
  3. 字符的精密(筆畫、像素精度)剪裁

4.3 凸包

  1. 引入:爲了減少計算量,在進行真正的求交計算之前,往往先用凸包等輔助結構進行粗略地比較,排除那些顯然不相交的情形。
    2.定義:一個圖形的凸包,就是包含這個圖形的凸區域(凸多邊形、凸多面體),它不是唯一的。 
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章