線段裁剪算法


裁剪:確定圖形中哪些部分落在顯示區之內,哪些落在顯示區之外,以便只顯示落在顯示區內的那部分圖形。這個選擇過程稱為裁剪。

圖形裁剪算法,直接影響圖形系統的效率。

Cohen-SutherLand直線裁剪算法

1、基本思想

對於每條線段P1P2分為三種情況處理:

  1. 若P1P2完全在窗口內,則顯示該線段P1P2。
  2. 若P1P2明顯在窗口外,則丟棄該線段。
  3. 若線段不滿足(1)或(2)的條件,則在交點處把線段分為兩段。其中一段完全在窗口外,可棄之。然后對另一段重復上述處理。

2、編碼方法

為了使計算機能夠快速的判斷一條線段與窗口屬於何種關系,采用如下編碼方法:把窗口的邊界延長成直線,窗口平台就分成9個分區,每個區設定一個4位的編碼與之對應。

平面上每一條直線的端點根據其所在的區域都可定義出兩個編碼。

img

編碼(以二進制形式自右向左給出)的意義如下:

  1. 第0位:如果端點在窗口左邊界左側,則為1,否則為0;
  2. 第1位:如果端點在窗口右邊界右側,則為1,否則為0;
  3. 第2位:如果端點在窗口下邊界下側,則為1,否則為0;
  4. 第3位:如果端點在窗口上邊界上側,則為1,否則為0。

3、線段裁剪

img

裁剪一條線段時,先求出端點p1和p2的編碼code1和code2:

  1. 如果code1和code2均為0,則說明P1和P2均在窗口內,那么線段全部位於窗口內部,應取之。(c)
  2. 如果code1和code2經過按位與運算后的結果code1&code2不等於0,說明P1和P2同時在窗口的上方、下方、左方或右方,那么線段全部位於窗口的外部,應棄之。(e,d)
  3. 如果上述兩種條件均不成立,則可按如下方法處理:求出線段與窗口邊界的交點,在交點處把線段一分為二,其中必有一段完全在窗口外,可以棄之。再對另一段重復進行上述處理,直到該線段完全被舍棄或者找到位於窗口內的一段線段為止。(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、小結

  • 本算法的優點在於簡單,易於實現。他可以簡單的描述為將直線在窗口左邊的部分刪去,按左,右,下,上的順序依次進行,處理之后,剩余部分就是可見的了。在這個算法中求交點是很重要的,他決定了算法的速度。另外,本算法對於其他形狀的窗口未必同樣有效
  • 特點:用編碼方法可快速判斷線段的完全可見和顯然不可見。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM