裁剪:確定圖形中哪些部分落在顯示區之內,哪些落在顯示區之外,以便只顯示落在顯示區內的那部分圖形。這個選擇過程稱為裁剪。
圖形裁剪算法,直接影響圖形系統的效率。
Cohen-SutherLand直線裁剪算法
1、基本思想
對於每條線段P1P2分為三種情況處理:
- 若P1P2完全在窗口內,則顯示該線段P1P2。
- 若P1P2明顯在窗口外,則丟棄該線段。
- 若線段不滿足(1)或(2)的條件,則在交點處把線段分為兩段。其中一段完全在窗口外,可棄之。然后對另一段重復上述處理。
2、編碼方法
為了使計算機能夠快速的判斷一條線段與窗口屬於何種關系,采用如下編碼方法:把窗口的邊界延長成直線,窗口平台就分成9個分區,每個區設定一個4位的編碼與之對應。
平面上每一條直線的端點根據其所在的區域都可定義出兩個編碼。
編碼(以二進制形式自右向左給出)的意義如下:
- 第0位:如果端點在窗口左邊界左側,則為1,否則為0;
- 第1位:如果端點在窗口右邊界右側,則為1,否則為0;
- 第2位:如果端點在窗口下邊界下側,則為1,否則為0;
- 第3位:如果端點在窗口上邊界上側,則為1,否則為0。
3、線段裁剪
裁剪一條線段時,先求出端點p1和p2的編碼code1和code2:
- 如果code1和code2均為0,則說明P1和P2均在窗口內,那么線段全部位於窗口內部,應取之。(c)
- 如果code1和code2經過按位與運算后的結果code1&code2不等於0,說明P1和P2同時在窗口的上方、下方、左方或右方,那么線段全部位於窗口的外部,應棄之。(e,d)
- 如果上述兩種條件均不成立,則可按如下方法處理:求出線段與窗口邊界的交點,在交點處把線段一分為二,其中必有一段完全在窗口外,可以棄之。再對另一段重復進行上述處理,直到該線段完全被舍棄或者找到位於窗口內的一段線段為止。(a,b,d’)
4、檢查順序
編碼中對應位為1的邊。
// 與左邊界相交
if (LEFT & code != 0) {
// 橫坐標是左邊界的位置
x = XL;
// 計算出y的位置
y = y1 + (y2 - y1) * (XL - x1) / (x2 - x1);
} else if (RIGHT & code != 0) {
x = XR;
y = y1 + (y2 - y1) * (XR - x1) / (x2 - x1);
} else if (BOTTOM & code != 0) {
y = YB;
x = x1 + (x2 - x1) * (YB - y1) / (y2 - y1);
} else if (TOP & code != 0) {
y = YT;
x = x1 + (x2 - x1) * (YT - y1) / (y2 - y1);
}
5、小結
- 本算法的優點在於簡單,易於實現。他可以簡單的描述為將直線在窗口左邊的部分刪去,按左,右,下,上的順序依次進行,處理之后,剩余部分就是可見的了。在這個算法中求交點是很重要的,他決定了算法的速度。另外,本算法對於其他形狀的窗口未必同樣有效。
- 特點:用編碼方法可快速判斷線段的完全可見和顯然不可見。