1. 程式人生 > >裁剪算法——Cohen-Sutherland算法

裁剪算法——Cohen-Sutherland算法

矩形窗 比較 算法比較 效率比較 條件 分享圖片 erl 過程 矩形

光柵圖形學算法——裁剪算法

一、直線裁剪算法

1、裁剪:計算機內部存儲的圖形往往比較大,而屏幕顯示的只是圖形的一部分,因此需要確定圖形哪些部分落在顯示區之內,哪些落在顯示區之外,這個選擇的過程就稱為裁剪。

1.1點的裁剪——>此方法太費時,效率比較低,一般不可取。

對於任意一點P(x,y)若滿足下列不等式,則點P在矩形窗口內
技術分享圖片技術分享圖片

1.2直線段的裁剪——>復雜圖形裁剪的基礎

要裁剪一條直線段,首先要判斷此直線的位置:
1)它是否完全落在裁剪窗口內?
2)它是否完全在窗口外?
3)如果不滿足以上兩個條件,則計算它與一個或多個裁剪邊界的交點。
技術分享圖片

二、Cohen-Sutherland算法(編碼裁剪算法)

首先對直線段的端點進行編碼。

基本思想:對每條直線段分三種情況處理:
1)若點p1和p2完全在裁剪窗口內——>“簡取”之(保留這條直線)
技術分享圖片



2)若點p1(x1,y1),p2(x2,y2)均在窗口外,且滿足下列四個條件之一:——>“簡棄”之(不要了)
技術分享圖片技術分享圖片

3)如果直線段既不滿足“簡取”的條件,也不滿足“簡棄”的條件?
——>需要對直線段按交點進行分段,分段後判斷直線是“簡取”還是“簡棄”。
技術分享圖片
技術分享圖片

裁剪一條線段時,先求出端點p1和p2的編碼code1和code2,然後進行二進制“或”運算和“與”運算
技術分享圖片
技術分享圖片

【若這兩個條件均不成立,則需要求出直線段與窗口邊界的交點在交點處把線段一分為二。】

如裁剪如下圖所示的直線段P1P2:
技術分享圖片
首先對P1P2進行編碼
技術分享圖片
令直線段與窗口左邊界的交點為P3,
則可知P1P3必在窗口外,可以簡棄之。
技術分享圖片
再令直線段與窗口下邊界的交點為P4,

技術分享圖片
剩下的直線段(P3P4)再進行進一步判斷,code1|code2=0,全在窗口中,簡取之
【點P在窗口邊界也屬於在窗口內】

【存在的問題】

技術分享圖片
如圖中線段全部在窗口外部,但是對兩段端點進行或/與運算時,需要再次取交點進行運算,最壞情況下,被裁剪線段與窗口4條邊計算交點,然後所得的裁剪結果卻可能是全部舍棄。

【小結】Cohen-Sutherland算法比較適合兩種情況:
1、大部分線段完全可見;
2、大部分線段完全不可見。

裁剪算法——Cohen-Sutherland算法