基礎(chǔ)的2-D繞原點旋轉(zhuǎn)

在2-D的迪卡爾坐標(biāo)系中,一個位置向量的旋轉(zhuǎn)公式可以由三角函數(shù)的幾何意義推出。比如上圖所示是位置向量R逆時針旋轉(zhuǎn)角度B前后的情況。在左圖中,我們有關(guān)系:
x0 = |R| * cosA
y0 = |R| * sinA
=>
cosA = x0 / |R|
sinA = y0 / |R|
在右圖中,我們有關(guān)系:
x1 = |R| * cos(A+B)
y1 = |R| * sin(A+B)
其中(x1, y1)就是(x0, y0)旋轉(zhuǎn)角B后得到的點,也就是位置向量R最后指向的點。我們展開cos(A+B)和sin(A+B),得到
x1 = |R| * (cosAcosB - sinAsinB)
y1 = |R| * (sinAcosB + cosAsinB)
現(xiàn)在把
cosA = x0 / |R|
sinA = y0 / |R|
代入上面的式子,得到
x1 = |R| * (x0 * cosB / |R| - y0 * sinB / |R|)
y1 = |R| * (y0 * cosB / |R| + x0 * sinB / |R|)
=>
x1 = x0 * cosB - y0 * sinB
y1 = x0 * sinB + y0 * cosB
這樣我們就得到了2-D迪卡爾坐標(biāo)下向量圍繞圓點的逆時針旋轉(zhuǎn)公式。順時針旋轉(zhuǎn)就把角度變?yōu)樨?fù):
x1 = x0 * cos(-B) - y0 * sin(-B)
y1 = x0 * sin(-B) + y0 * cos(-B)
=>
x1 = x0 * cosB + y0 * sinB
y1 = -x0 * sinB + y0 * cosB
現(xiàn)在我要把這個旋轉(zhuǎn)公式寫成矩陣的形式,有一個概念我簡單提一下,平面或空間里的每個線性變換(這里就是旋轉(zhuǎn)變換)都對應(yīng)一個矩陣,叫做變換矩陣。對一個點實施線性變換就是通過乘上該線性變換的矩陣完成的。好了,打住,不然就跑題了。
所以2-D旋轉(zhuǎn)變換矩陣就是:
[cosA sinA] [cosA -sinA]
[-sinA cosA] 或者 [sinA cosA]
我們對點進(jìn)行旋轉(zhuǎn)變換可以通過矩陣完成,比如我要點(x, y)繞原點逆時針旋轉(zhuǎn):
[cosA sinA]
[x, y] x [-sinA cosA] = [x*cosA-y*sinA x*sinA+y*cosA]
為了編程方便,我們把它寫成兩個方陣
[x, y] [cosA sinA] [x*cosA-y*sinA x*sinA+y*cosA]
[0, 0] x [-sinA cosA] = [0 0 ]
也可以寫成
[cosA -sinA] [x 0] [x*cosA-y*sinA 0]
[sinA cosA] x [y 0] = [x*sinA+y*cosA 0]
三、2-D的繞任一點旋轉(zhuǎn)
下面我們深入一些,思考另一種情況:求一個點圍繞任一個非原點的中心點旋轉(zhuǎn)。
我們剛剛導(dǎo)出的公式是圍繞原點旋轉(zhuǎn)的公式,所以我們要想繼續(xù)使用它,就要把想要圍繞的那個非原點的中心點移動到原點上來。按照這個思路,我們先將該中心點通過一個位移向量移動到原點,而圍繞點要保持與中心點相對位置不變,也相應(yīng)的按照這個位移向量位移,此時由于中心點已經(jīng)移動到了圓點,就可以讓同樣位移后的圍繞點使用上面的公式來計算旋轉(zhuǎn)后的位置了,計算完后,再讓計算出的點按剛才的位移向量逆位移,就得到圍繞點繞中心點旋轉(zhuǎn)一定角度后的新位置了。看下面的圖
現(xiàn)在求左下方的藍(lán)色點圍繞紅色點旋轉(zhuǎn)一定角度后的新位置。由于紅色點不在原點,所以可以通過紅色向量把它移動到原點,此時藍(lán)色的點也按照這個向量移動,可見,紅色和藍(lán)色點的相對位置沒有變。現(xiàn)在紅色點在原點,藍(lán)色點可以用上面旋轉(zhuǎn)變換矩陣進(jìn)行旋轉(zhuǎn),旋轉(zhuǎn)后的點在通過紅色向量的的逆向量回到它實際圍繞下方紅色點旋轉(zhuǎn)后的位置。
在這個過程中,我們對圍繞點進(jìn)行了三次線性變換:位移變換-旋轉(zhuǎn)變換-位移變換,我們把它寫成矩陣形式:
設(shè)紅色向量為(rtx, rty)
[x y 1] [1 0 0] [cosA sinA 0] [1 0 0] [x' y' -]
[0 1 0] x [0 1 0] x [-sinA cosA 0] x [0 1 0] = [- - -]
[0 0 1] [rtx rty 1] [0 0 1] [-rtx -rty 1] [- - -]
最后得到的矩陣的x'和y'就是我們旋轉(zhuǎn)后的點坐標(biāo)。