【引入】算法
1. 爲何要裁剪?——使用計算機處理圖形信息時,計算機內部存儲的圖形每每比較大,而屏幕顯示的知識圖形的一部分。所以須要肯定圖形哪些部分落在顯示區以內,哪些落在顯示區以外。這個過程就稱爲裁剪。編碼
2. 點的裁剪——只需判斷點的座標在不在矩形區域內,但判斷圖形中每一個點是否在窗口內,太費時,不可取。spa
3. 直線段的裁剪——爲複雜圖形裁剪的基礎。3d
要裁剪一條直線段,首先要判斷:code
1)它是否徹底落在裁剪窗口內?blog
2)它是否徹底在窗口外?效率
3)若是不知足以上兩個條件,則計算它與一個或多個裁剪邊界的交點。基礎
經常使用的裁剪算法有三種:Cohen-Sutherland、中點分割法、Liang-Barsky裁剪算法。原理
1、Cohen-Sutherland算法(編碼裁剪算法)終端
1. 算法原理:
對每條直線分三種狀況處理:
1)若點P1和P2徹底在裁剪窗口內,「簡取」之。
2)若P1(x1,y1)和P2(x2,y2)均在窗口外,且知足下列四個條件之一,「簡棄」。
x1 < xleft 且 x2 < xleft
x1 > xright 且 x2 > xright
y1 < ybottom 且 y2 < ybottom
y1 > ytop 且 y2 > ytop
3)若是直線段既不知足「簡取」條件,也不知足「簡棄」條件,須要對直線進行分段,而後判斷是「簡取」仍是「簡棄」。
2. 編碼
1° 每條線段的端點都賦以四位二進制碼D3D2D1D0,編碼規則以下:
若 x < xleft,則D0 = 1,不然D0 = 0;——對應左邊界
若 x > xright,則D1 = 1,不然D1 = 0;——對應右邊界
若 y < ybottom,則D2 = 1,不然D2 = 0;——對應下邊界
若 y > ytop,則D3 = 1,不然D3 = 0;——對應上邊界
窗口及其延長線所構成了9個區域。根據該編碼規則:
2° 裁剪一條線段時,先求出端點p1和p2的編碼code1和code2,而後進行二進制「或」運算和「與」運算
1)若code1丨code2 = 0,對直線段應簡取;
2)若code1 & code2 ≠ 0,對直線應簡棄;
3)若上述兩條件均不成立,則需求出直線段與窗口邊界的交點,在交點處把線段一分爲二;
下面根據該算法步驟裁剪如圖所示的直線段P1P2,按照左右上下的順序求出直線段與窗口左邊界的交點爲P3,P1P3必在窗口外,可簡棄。對P2P3重複上述處理。
剩下的直線段P3P4再進一步判斷,code1 丨code2 = 0,全在窗口中,簡取。
3. 算法評價:比較適合兩種狀況,一是大部分線段徹底可見;二是大部分線段徹底不可見。
2、中點分割算法
1. 算法思想:和Cohen-Sutherland算法同樣首先對直線段的端點進行編碼,而後經過二分逼近來肯定直線段與窗口的交點。
2. 步驟:
1° 對直線段的端點進行如Cohen-Sutherland算法同樣的編碼,符合簡取條件簡取,符合簡棄條件簡棄;
2° 若是不符合簡取和簡棄條件,則二分求中點,分紅兩條線段,若中點不在窗口內,則把中點裏窗口邊界最遠點構成的線段丟掉,保留另外一半;
3° 重複步驟1°2°直到中點與窗口邊界的座標值在規定的偏差範圍內相等;
三、Liang-Barsky算法
1. 核心思想:
1)直線方程用參數方程表示;
x = x1 + u · (x2 - x1) = x1 + ∆x · u
y = y1 + u · (y2 - y1) = y1 + ∆y · u (0 ≤ u ≤ 1)
2)把被裁剪的直線段當作是一條有方向的線段,把窗口的四條邊分紅兩類:入邊和出邊。
3)裁剪結果的線段起點就是直線和兩條入邊的交點以及始端點三個點裏參數u最大的點;
裁剪線段的終點是和兩條出邊的交點以及終端點三個點裏參數u最小的點。
若是用u1,u2分別表示線段(u1 ≤ u2)可見部分的開始和結束,則有:
u1 = max(0, ul, ub) u2 = min(1, ut, ur)
2. 參數:
變形得
繼續變形得
令:
’3. 步驟:
1° 輸入直線段的兩端點座標(x1, y1)、(x2, y2),以及窗口的四條邊界座標:xl, xr, yt, yb;
2° 若∆x = 0,則P1=P2=0,此時進一步判斷是否知足q1<0或q2<0,若知足,則該直線不在窗口內,跳轉7°結束;不然,知足q1≥0且q2≥0,則進一步計算Umax和Umin:
Umax = max(0,Uk丨pk<0) Umin = min(1,Uk丨pk>0)
其中Uk = qk / pk (pk ≠ 0,k = 3,4),算法跳轉5°;
3° 若∆y = 0,則P3=P4=0,此時進一步判斷是否知足q3<0或q4<0,若知足,則該直線不在窗口內,跳轉7°結束;不然,知足q3≥0且q4≥0,則進一步計算Umax和Umin:
Umax = max(0,Uk丨pk<0) Umin = min(1,Uk丨pk>0)
其中Uk = qk / pk (pk ≠ 0,k = 1,2),算法跳轉5°;
4° 若上述兩條均不知足,則有Pk≠0(k=1,2,3,4),此時進一步計算Umax和Umin:
Umax = max(0,Uk丨pk<0) Umin = min(1,Uk丨pk>0)
其中Uk = qk / pk (pk ≠ 0,k = 1,2,3,4);
5° 求得Umax和Umin後,進行判斷:若Umax>Umin,則直線在窗口外,跳轉7°;若Umax小於等於Umin,利用直線的參數方程求得所須要取得兩端點;
6° 利用直線掃描轉換算法繪製在窗口內的直線段;
7° 算法結束。
4. 評價:
1)若是被裁剪的圖形大部分線段要麼在窗口內或者要麼徹底在窗口外,不多貫穿窗口的。Cohen-Sutherland算法效果很是好;通常狀況下Liang-Barsky算法的效率則優於Cohen-Sutherland算法;
2)Cohen-Sutherland算法和Liang-Barsky算法只能運用於矩形窗口。