直線裁剪算法
一、
1、裁剪:確定圖形哪些部分落在顯示區之內,哪些落在顯示區外。這個選擇的過程就稱為裁剪。
2、直線段的裁剪:Cohen-Suther land、中點分割法和Liang-Barsky裁剪算法
二、Cohen-Suther land算法
又稱編碼裁剪算法,算法的基本思想是對每條直線分三種情況處理:
1>若端點完全在裁剪窗口內----“簡取”之

2>若端點完全在裁剪窗口外,且滿足下列四個條件之一----“簡棄”之

3>既不滿足簡取,也不滿足簡棄:對直線段按交點進行分段,分段后判斷直線是“簡取”還是“簡棄”
每條線段的端點都賦以四位二進制碼D3D2D1D0,編碼規則如下:(左右下上)

例如:

裁剪一條線段時,先求出端點P1,P2的編碼code,然后進行二進制“或”和“與”運算
(1)若code1|code2=0,對直線段簡取
(2)若code1&code2不等於0,對直線段簡棄
(3)若上述兩條件都不成立,則需要求出直線段與窗口邊界的交點,並在交點處把直線段一分為二
3、存在問題:
一條完全在窗口外的直線,進行與運算=0,還需求交點,然后所得結果還是全部舍棄三、
三、中點分割算法
1、核心思想:通過二分逼近來確定直線段與窗口的交點
2、注意:
1>若中點不在窗口內,則把中點和離窗口邊界最遠點構成的線段丟掉,線段上的另一點和該中點再構成線段求其中點
2>若中點在窗口內,則以中點和最遠點構成線段,求其中點,直到中點與窗口邊界的坐標值在規定的誤差范圍內
3、問題:中點分割算法會不會無限循環下去?
不會。因為屏幕像素是有限的,一般計算次數不會太多,而且允許在誤差范圍內
四、Liang-Barsky裁剪算法
1、主要思想:用參數方程表示一條直線段(0<=U<=1)
X=X1+U*(X2-X1)=X1+U*△X
Y=Y1+U*(Y2-Y1)=Y1+U*△Y
2、把直線看成是一條有方向的線段,把窗口的四條邊及其延長線分成兩類:入邊和出邊
入邊:左邊界和下邊界
出邊:右邊界和上邊界

如何求出起點和終點的坐標?(即起點和終點的參數值u)

判斷線段某一部分是否在窗口內,可以簡化為判斷直線上一個點是否在窗口內的問題,窗口內的P點滿足什么條件?

3、舉例:



3、Liang-Barsky算法小結
1>直線方程參數化
2>直線段是有方向的
3>把窗口的四條邊分成入邊和出邊
五、Cohen-Suther land算法和Liang-Barsky算法比較
1、Cohen-Suther land算法的核心思想是編碼,窗口和延長線把空間分成了9個區域
2、線段要么大部分在窗口外,要么大部分在窗口內,使用Cohen-Suther land效果好
3、一般情況下(線段貫穿窗口),優先使用Liang-Barsky算法
4、兩者均只能應用於矩形窗口
