在圖形的顯示過程中,因為屏幕顯示的內容有限,所以需要裁剪
要實現這個轉換,簡便的方法是全部掃描一遍然后判斷像素是不是落在視區中。
但是如果原圖很大,這個遍歷全部像素的方法效率較低。
最常用的是在世界坐標系上,對參數表示的圖形裁剪。
裁剪的定義
判斷圖形元素是否落在裁剪窗口之內並找出其位於內部的部分
定義矩形裁剪窗口:\(x_{min},y_{min}-x_{max},y_{max}\)

直線段的裁剪
定義直線段\(P_0(x_0,y_0)P_1(x_1,x_2)\)
直線段與窗口的關系有:
- 完全可見:兩個端點都位於窗口內
- 非顯然不可見:線段至少有一端點位於窗口外
- 顯然不可見:兩個端點都位於窗口外?
兩個端點位於窗口外不一定是顯然不可見,也可能是非顯然不可見。怎樣才能算顯然不可見?
為窗口邊界畫出延長線:
觀察可以發現,如果兩個端點位於同邊界的外側,就可以得出顯然不可見的答案
右下角的線段應該屬於非完全可見,非顯然不可見,因為不屬於同邊界的外側可能在屏幕中出現一部分。
這就要用到規范的編碼算法
編碼算法
設編碼為\(D_3D_2D_1D_0\)
編碼規則是:
當\(x<x_{min}\),\(D_0=1\),否則為\(0\)
當\(x>x_{max}\),\(D_1=1\),否則為\(0\)
當\(y<y_{min}\),\(D_2=1\),否則為\(0\)
當\(y>y_{max}\),\(D_3=1\),否則為\(0\)
得到一條直線,設端點的編碼為code1和code2
- 若\(code_1|code_2=0\),線段在窗口內,完全可見
- 若\(code1\&code_2\neq0\),線段在窗口外,非完全可見
其他情況:則為非完全可見,非顯然不可見。
求線段與延長線的交點,其中一段肯定為顯然不可見,對另外一段從第一步開始判斷
觀察:若兩個code某一位上不同,說明線段與某個邊相交,如\(D_2\)位不同,那就與下邊相交。
適用范圍
這個算法的好處是可以快速判斷顯然可見和顯然不可見。
對於非顯然不可見,最多需要求交點四次。
如從0101到1010,與邊界可能交於4個點
對於窗口很大或者窗口很小的情況下效率較高
對於非矩形,凸多邊形的情況下也可以使用編碼算法,但隨着邊數增多,編碼會變得復雜