裁剪:編碼裁剪算法


在圖形的顯示過程中,因為屏幕顯示的內容有限,所以需要裁剪

要實現這個轉換,簡便的方法是全部掃描一遍然后判斷像素是不是落在視區中。

但是如果原圖很大,這個遍歷全部像素的方法效率較低。

最常用的是在世界坐標系上,對參數表示的圖形裁剪。

裁剪的定義

判斷圖形元素是否落在裁剪窗口之內並找出其位於內部的部分

定義矩形裁剪窗口:\(x_{min},y_{min}-x_{max},y_{max}\)

image-20200502175130521

直線段的裁剪

定義直線段\(P_0(x_0,y_0)P_1(x_1,x_2)\)

直線段與窗口的關系有:

  1. 完全可見:兩個端點都位於窗口內
  2. 非顯然不可見:線段至少有一端點位於窗口外
  3. 顯然不可見:兩個端點都位於窗口外?

兩個端點位於窗口外不一定是顯然不可見,也可能是非顯然不可見。怎樣才能算顯然不可見?

為窗口邊界畫出延長線:

觀察可以發現,如果兩個端點位於同邊界的外側,就可以得出顯然不可見的答案

右下角的線段應該屬於非完全可見,非顯然不可見,因為不屬於同邊界的外側可能在屏幕中出現一部分。

這就要用到規范的編碼算法

編碼算法

設編碼為\(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個點

對於窗口很大或者窗口很小的情況下效率較高

對於非矩形,凸多邊形的情況下也可以使用編碼算法,但隨着邊數增多,編碼會變得復雜


免責聲明!

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



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