(12)裁剪之直線段裁剪

圖形裁剪的定義:肯定圖形在指定區域(即裁剪窗口)內的部分並保留,以及在區域外的部分並裁掉的過程稱爲圖形裁剪。

  假定:裁剪窗口爲矩形窗口,左下點座標爲(xl, yb),  右上點座標爲(xr, yt)。 算法


直線段的裁剪

定義:直線段裁剪就是保留給定線段在窗口內的部分。
 直線段與窗口的位置關係有如下幾種狀況:

⑴ 直線段兩個端點在窗口內(線段c);
⑵ 直線段兩個端點在窗口外,且與窗口不相交(線段d和e);
⑶ 直線段兩個端點在窗口外,但與窗口相交(線段b);
⑷ 直線段一個端點在窗口內,一個端點在窗口外(線段a)。

編碼裁剪算法(也稱Cohen-Sutherland算法)

該算法基於如下考慮:每一線段或者整個位於窗口內部,或者被窗口分割而使其中的一部分捨棄。  測試

算法步驟:
第1步:肯定一條線段是否整個位於窗口內,如果,則取之;
第2步:肯定該線段是否整個位於窗口外,如果,則棄之;
第3步:若第一、2步判斷均不成立,則經過窗口邊界所在的直線將線段分紅兩部分,再對每一部分進行第一、2步的測式。 
編碼

區域編碼:
實現該算法時,需延長窗口邊界,把平面劃分爲9個區域,每一個區域用4位二進制代碼表示。線段的兩個端點按其所在區域賦與對應的代碼,4位代碼的意義以下(從右到左): 
spa


編碼規則可知:
①若兩個端點編碼都爲0000,則直線段所有位於窗口內;
②若兩個端點編碼的位邏輯乘(按位與)不爲0,則整條線段位於窗口外;
③若線段不能由以上兩種測試決定,則可能部分可見,需求交點,把線段再分割。
blog

分割方法:
計算出直線段與窗口某一邊界(或邊界延長線)的交點,再用上述①、 ②兩種條件判別分割後的兩條線段,捨棄位於窗口外的一段。
 例:用編碼裁剪算法對AB線段裁剪,能夠在C點分割,對AC、CB進行判別,捨棄AC,再分割於D點,對CD、DB做判別,捨棄CD,而DB所有位於窗口內,算法結束。 
硬件


線段編碼不一樣分佈狀況下裁剪線段可見性分析:
①線段a所有在窗口內,則所有顯示,不須要求交點;
②線段b所有在窗口外(在窗口同側),則所有不顯示,不須要求交點;
③線段c一部分在窗口內,一部分在窗口外,則須要先求交點,再顯示兩交點之間的線段;
④線段d所有在窗口外(跨越三個區域),則只須要求交點一次便可斷定剩下的線段所有在窗口外。
二進制


關於算法實現過程當中的幾點說明:
1)通常按固定順序檢測區號的各位是否爲0。可按左→右→下→上或上→下→右→左的順序。
2)欲捨棄窗口外的子線段,只要用交點的座標值取代被捨棄端點的座標便可。
3)當須要求交點時,沒必要把線段與每條窗口邊界都求交,只要按順序檢測到端點區碼的某位不爲0時,才把線段與對應的窗口邊界求交。 
方法


編碼裁剪算法的特色:
編碼方法直觀方便,速度較快,是一種較好的裁剪方法,但有兩個問題有待進一步解決:
①採用位邏輯乘(按位與)的運算,在有些高級語言中不便進行;
②所有捨棄的判斷只適合於那些僅在窗口同側的線段(如線段b),對於跨越三個區域的線段(如線段d),則不能一次做出判別而捨棄它們。
im


中點分割裁剪算法

 基本思想:分別尋找直線段兩個端點各自對應的最遠可見點,這兩個最遠可見點之間的線段即爲要輸出的可見段。


線段P一、P2的端點P1的最遠可見點爲I1,端點P2的最遠可見點爲I2,則線段I一、I2爲輸出的可見部分。
db


中點分割裁剪算法的步驟: 
以找出直線段上距離端點P1的最遠可見點爲例。


⑴ 判斷直線段是否所有在窗口外,如果,則裁剪過程結束,無可見段輸出(圖中a);不然繼續⑵。

⑵ 判斷P2點是否可見,如果,則P2點即爲距P1點最遠的可見點(圖中b),返回;不然,繼續⑶。 

⑶ 將直線段對分,中點爲Pm,若是所有在窗口外(圖中d),則用代替;不然用代替(圖中e),對新的從第一步從新開始。 

重複上述過程,直到的長度小於給定的偏差ε(即認爲已與窗口的一個邊界相交)爲止。

找到了距P1點的最遠可見點後,把兩個端點對調一下,即對直線段用一樣的算法步驟,便可找出距P2點的最遠可見點。鏈接這兩個可見點,即獲得要輸出的可見段。 


中點分割裁剪算法的特色: 該算法中求線段中點能夠由加法和移位來實現(除2運算可用移位完成),避免使用了乘除法。所以,該算法易於用硬件來實現。若是容許兩個找最遠可見點的過程平行進行,則裁剪速度更快。