計算機圖形學(四)_幾何變換_1_基本的二維幾何變換(三)_縮放

heyuchang666發表於2017-03-09

基本的二維幾何變換(三)_縮放


        改變一個物件的大小,可使用縮放(scaling)變換。一個簡單的二維縮放操作可通過將縮放係數(scaling factor)Sx 和 Sy與物件座標位置(x, y)相乘而得:

縮放係數Sx 在x方向縮放物件,而Sy在y方向進行縮放。基本的二維縮放方程(5.10)也可以寫成矩陣形式:

或:

其中,S是等式(5.11)中的2x2縮放矩陣。
         可以賦給縮放係數Sx和Sy任何正數值。值小於1將縮小物件的尺寸,值大於1則放大物件。如果將Sx和Sy都指定為1,那麼物件尺寸就不會改變。當賦給Sx和Sy相同的值時,就會產生保持物件相對比例的一致縮放(uniform scaling)。 Sx和Sy值不等時將產生設計應用中常見的差值縮放(differential scaling),其中的圖形由少數形狀經縮放和定位變換來構造。在有些系統中,也可為縮放引數指定負值。這不僅改變物件的尺寸,還相對於一個或多個座標軸反射。
         利用方程(5.11)變換的物件既被縮放,又被重定位。當縮放係數的絕對值小於1時,縮放後的物件向原點靠近;而縮放係數絕對值大於1時,縮放後的座標位置遠離原點。如圖5.7給出了將值0.5賦給方程(5.11)中的Sx和Sy、時對線段的縮放。線段的長度和到原點的距離都減少到1/2。

        我們可以選擇一個在縮放變換後不改變位置的點,稱為固定點(fixed point),以控制縮放後物件的位置。固定點的座標(xfyf)可以選擇物件的中點等位置或任何其他空間位置。這樣,多邊形通過縮放每個頂點到固定點的距離而相對於固定點進行縮放(參見圖5.8 )。對於座標為(x, y)的頂點,縮放後的座標(x', y')可計算為:

我們可以將乘積項和加法項分開而重寫上述縮放變換公式:

其中,加法項xf(1-sx)和yf(1 - sy)對於物件中的任何點都是常數。

        在縮放公式中包含固定點的座標,類似於在旋轉公式中包含基準點的座標。我們可以建立一個其元素為方程(5.14)中常數項的列向量,然後將這個列向量加到等式(5.12)中的乘積S*P上。下一節將討論僅包含矩陣乘法的變換方程的矩陣形式。
        多邊形的縮放可以通過將變換方程(5.14)應用於每個頂點,然後利用變換後的頂點重新生成多邊形而實現。其他物件的變換則將縮放變換公式應用到定義物件的引數上。要改變圓的大小,可通過縮放其半徑並計算圓上座標點的新座標位置來實現。標準位置中的橢圓通過縮放兩個軸並且按其中心座標重新繪製橢圓而實現縮放橢圓尺寸。

        下列程式給出了對一個多邊形縮放進行計算的例子。多邊形頂點和固定點的座標以及縮放係數是輸入引數。座標變換後,使用OpenGL子程式重新生成縮放後的多邊形。

void scalePolygon (wcPt2D *verts, GLint nVerts, wcPt2D fixedPt, GLfloat sx, GLfloat sy)
{
	wcPt2D vertsNew;
	GLint k;
	
	for(k = 0; k < nVerts; k++){
		vertsNew[k].x = verts[k].x * sx + fixedPt.x * (1 - sx);
		vertsNew[k].y = verts[k].y * sy + fixedPt.y * (1 - sy);
	}
	glBegin {GL_POLYGON};
		for (k = 0; k < nVerts; k++)
			glVertex2f (vertsNew[k].x, vertsNew[k].y);
	glEnd( );
}


相關文章