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

heyuchang666發表於2017-03-03
二維旋轉
        通過指定一個旋轉軸(rotation axis)和一個旋轉角度(rotation angle),可以進行一次旋轉(rotation)變換。在將物件的所有頂點按指定角度繞指定旋轉軸旋轉後,該物件的所有點都旋轉到新位置。
        一個物件的二維旋轉通過在xy平面上沿圓路徑將物件重定位來實現。此時,我們將物件繞與xy平面垂直的旋轉軸(與z軸平行)旋轉。三維旋轉的引數有旋轉角θ和稱為旋轉點(rotation point或pivot point )的位置(
xr , yr),物件繞該點旋轉(如下圖)。基準點是旋轉軸與xy平面的交點。正角度θ定義繞基準點的逆時針旋轉(如下圖),而負角度將物件沿順時針方向旋轉。

        為了簡化該基本方法的敘述,我們首先確定當基準點為座標原點時點位置P進行旋轉的變換方程。原始點和變換後點位置的角度和座標關係如圖所示。其中,r是點到原點的固定距離,角Φ是點的原始角度位置與水平線的夾角,θ是旋轉角。應用標準的三角等式,我們可以利用角度θ和Φ將轉換後的座標表示為方程1:

在極座標系中,點的原始座標為方程2:

將方程2代人方程1中,我們就得到相對於原點,將位置(x, y)的點旋轉θ角的變換方程3:

因為列向量表示式表示座標位置為:

那麼旋轉方程的矩陣形式為方程4:

其中,旋轉矩陣為

    列向量表示式中座標位置P的列向量是標準的數學表示。然而,早期的圖形系統有時用行向量表示座標位置,這會改變執行旋轉時矩陣相乘的次序。但現在,OpenGL, Java, PHIGS和GKS都按標準列向量方式表示。

方程2中給出了繞任意基準點旋轉一個點的例子。利用圖中的三角關係,可以將方程3規範化為繞任意指定的旋轉位置(xr , yr))旋轉的點的變換方程5:

這個通用旋轉方程不同於方程3,該方程包含了一個加項以及在座標值上的多重係數。因此,通過其中的元素包含方程5中的加項(平移項)的列向量矩陣加法,就可以修改矩陣方程4,使其包括基準點座標。然而,還有更好的方法可以形成這樣的矩陣公式,在4.2節
我們將討論表達變換公式的更一致的方法。

        類似於平移,旋轉是一種不變形地移動物件的剛體變換,物件上的所有點旋轉相同的角度。線段的旋轉可以通過將旋轉方程5用於每個線段端點,並重新繪製新端點間的線段而得到。多邊形的旋轉則是將每個頂點旋轉指定的旋轉角,並使用新的頂點來生成多邊形而實現旋轉。曲線的旋轉通過定位定義的點並重新繪製曲線而完成。例如圓或橢圓,可以通過將中心位置沿指定旋轉角對著的弧移動而繞非中心軸旋轉。橢圓可通過旋轉其長軸和短軸來實現繞其中心位置的旋轉。

        在下列程式示例中,一個多邊形繞指定的世界座標系中的基準點旋轉。旋轉過程的輸入引數是原始的多邊形頂點、基準點座標和用弧度表示的旋轉角θ,多邊形用OpenGL子程式重新生成。

class wcPt2D {
		public:
			GLfloat x, y;
	};
	
	void rotatePolyon (wcPt2D * verts, GLint nVerts, wcPt2D pivPt, GLdouble theta)
	{
		wcPt2D * vertsRot;
		GLint k;
		
		for (k = 0; k < nVerts; k++){
			vertsRot [k].x = pivPt.x + (verts [k].x - pivPt.x) * cos(theta) - (verts [k].y - pivPt.y) * sin(theta);
			vertsRot [k].y = pivPt.y + (verts [k].x - pivPt.x) * sin(theta) + (verts [k].y - pivPt.y) * cos(theta);
		}
		glBegin {GL_POLYGON};
			for(k = 0; k < nVerts; k++)
				glVertex2f (vertsRot [k].x, vertsRot [k].y);
		glEnd();
	}



相關文章