二維幾何變換
爲方便計算,使用齊次座標表示像素點,即p=[x,y,1]′表示笛卡爾座標(x,y),所有簡單變換都可以表示爲Mp,其中M爲變換矩陣。
- 平移變化:{x′=x+Δxy′=y+Δy,矩陣形式爲T=⎣⎡100010txty1⎦⎤
- 旋轉變換:繞原點逆時針旋轉θ度,則{x′=xcosθ−ysinθy′=xsinθ+ycosθ,矩陣形式爲R=⎣⎡cosθsinθ0−sinθcosθ0001⎦⎤
- 縮放變換:以原點爲固定點縮放,{x′=sxxy′=syy,矩陣形式爲S=⎣⎡sx000sy0001⎦⎤
- 複合變換:只需利用矩陣的連乘即可實現複合運算,如先旋轉後平移爲T(Rp)=(TR)p,新的變換矩陣爲M=TR,即按照從右到左的順序書寫即可。
- 其他變換:
- 鏡像變換:座標軸鏡像只需改變係數正負即可,M=⎣⎡−100010001⎦⎤爲y軸鏡像變化矩陣。繞指定直線鏡像可由如下步驟獲得:
- 平移對稱軸和圖元,使得對稱軸過原點
- 旋轉對稱軸和圖元使得對稱軸和座標軸重合
- 沿座標軸鏡像變換
- 執行上述過程的逆過程
- 錯切變換:即從矩形到平行四邊形的變化,變換矩陣爲x(y)的線性函數
二維觀察變換
二維觀察是要指定圖形中要顯示的部分及在顯示器的位置,即將窗口中的內容映射到視區中,一般窗口和視區都是矩形。
二維觀察變換一般是簡單變換的複合變換,即對窗口中的每個像素執行相同的變換。在實際實現時可以採用前向映射和後向映射的方法(和DIP算法中一致)。
二維圖形裁剪
裁剪實際上是爲了加速計算的,即只計算視區內部的圖元部分。在以下討論中,p(x,y)都表示完成窗口到視區映射後點p0的座標。
點裁剪
由於點不具有除了位置以外的二維性質,因此只需判斷是否在視區內部即可。
線段裁剪
在樸素的思想中,只需求得線段方程和視區四個邊界的交點並判斷位置關係即可,不過計算量較大。好的算法應該可以使用非常小的代價過濾不可能在視區內的直線,並利用硬件優化。
Cohen-Sutherland算法
Cohen-Sutherland算法爲最早、最流行的線段裁剪算法,通過爲區域編碼減少運算次數。其基本思想由下圖表示:
由於窗口有八個相鄰區域,因此使用4位編碼方式爲線段的端點編碼,從左至右分別表示:上邊界,下邊界,右邊界,左邊界(編碼順序可隨意改變)。如上圖中直線的兩端點編碼分別爲c1=0001和c2=1000。對兩端點的編碼只需8個cpu週期即可完成
端點編碼有如下性質:
- 線段在窗口內部⟺兩端點編碼都爲0000,即c1∣c2=0000
- 兩端點都在同一區域中,或在同一側的不同區域中,即c1&c2̸=0000⇒線段在窗口外
上述過濾需要兩個cpu週期
過濾後的線段和窗口一定有相交區域,之後通過計算交點即可完成裁剪。
樑友棟-Barsky參數裁剪算法
Liang-Barsky算法利用了直線的參數方程形式:{x=x1+uΔxy=y1+uΔy,其中Δx=(x2−x1),Δy=(y2−y1),點P在線段內部當且僅當0≤u≤1。
基本思想:
將裁剪窗口的四個邊界雙延長爲直線,則不平行於窗口邊界的直線和邊界延長線有四個交點。
定義直線方向爲線段方向P1→P2,四個邊界可將二維空間分割成兩個部分,定義包含裁剪窗口的一側爲內部,則直線相對於每個邊界都是從外部延伸到內部的或從內部延伸到外部的。
如右圖此直線即爲從左邊界的外部延伸到內部的。
Liang-Brasky算法的思想即爲線段參數設立初始值u1=0和u2=1表示線段在窗口內部的部分,之後計算線段所在直線和窗口邊界的交點參數uk
- 如果爲從外部延伸到內部,則更新u1=max{u1,ut}
- 如果爲從外部延伸到內部,則更新u2=min{u2,ut}
- 如果u1≥u2,則該線段完全在窗口外部,終止算法
- 否則四輪計算後的u1,u2內部區域即爲裁剪後線段。
實現優化
如果點P(x,y)位於由座標(xmin,ymin)和(xmax,ymax)所確定的窗口內,那麼下式成立:
xmin≤x1+uΔx≤xmax
ymin≤y1+uΔy≤ymax
變形後可以統一表示爲:upk≤qk,其中pk in {−Δx,Δx,−Δy,Δy};qk in {x1−xmin,xmax−x1,y1−ymin,ymax−y1}
- 若pk=0 and qk<0,則upk=0<0不成立,線段在窗口外。
- Δx>0⇒p1<0,p2>0,因此直線從左邊界外部延伸到內部,從右邊界內部延伸到外部。
- Δy>0⇒p3<0,p4>0,直線從上邊界外部延伸到內部,從下邊界內部延伸到外部。
Nicholl-Lee-Nicholl算法
Nicholl-Lee-Nicholl算法通過線段一個端點P1到裁剪窗口四個端點繪製四射線將二維平面重新劃分爲更多部分,然後通過P1在九宮格中的位置分情況討論,根據P2在哪個區域中判斷線段和裁剪窗口的交集和具有交點的邊界。
多邊形裁剪
多邊形裁剪實際上即對多邊形邊界線段的裁剪。
Sutherland-Hodgman算法
SH算法通過對四個邊界執行四次裁剪獲得有序的裁剪後頂點集合,每次裁剪的輸出作爲下一次裁剪的輸入。
每次裁剪中,按照順時針(逆時針)方向遍歷所有線段:
- 若起點和終點都在外部區域,則捨棄
- 若起點在外部區域,終點在內部區域,則將交點和終點按順序加入頂點集
- 若兩點都在內部區域,則將兩點按順序加入頂點集
- 若起點在內部區域,終點在外部區域,則將起點和交點按順序加入頂點集
問題和優化:對於凹多邊形的裁剪,可能會出現多餘的線段,如右圖:。可以通過將凹多邊形分割爲多個凸多邊形避免。
Weilerr-Atherton算法
在連接裁剪後的頂點時,對於多邊形邊界和窗口邊界的交點,可以按照多邊形邊界繼續連接或沿窗口邊界連接。WA算法即定義了連接規則(假設順時針遍歷頂點):
- 若交點處多邊形邊界爲從外部進入內部,則按照多邊形邊界順時針連接
- 若交點處多邊形邊界爲從內部進入外部,則按照窗口邊界順時針連接
實現:
在實現時通過建立多邊形頂點表和裁剪窗口頂點表優化算法,按順序將交點加入兩表中,當遇到邊界後按照連接規則切換頂點表跟蹤。如下圖:
多邊形定點表爲:v1,v1′,v2,v3,v3′,v4,v4′,v5,v5′,v6
窗口邊界定點表爲:p1,p2,p3,p4,v5′,v4′,v3′,v1′
從交點v1′開始跟蹤,則跟蹤過程爲: