高維空間點的旋轉問題?

在二維空間中,有點P = (1,2),Q=(2,1),要想將vec{OP} 旋轉到vec{OQ}所在的方向,只要先計算vec{OP},vec{OQ}兩個向量之間的夾角,然後按照旋轉矩陣進行旋轉,就能將vec{OP} 旋轉到vec{OQ}所在的方向。

那麼,在三維情形下,比如P=(1,1,2),Q=(1,2,2)

如何將vec{OP} 旋轉到vec{OQ}所在的方向?更高維呢?


寫個想法拋磚引玉了.

所謂旋轉, 是指一個矩陣變換, 這裡的變換矩陣是行列式為1的正交陣.

所以題主的問題也就是: "如何求出一個行列式為1的正交陣, 使得它作用在overrightarrow{OP}向量上, 所得的結果和overrightarrow{OQ}向量平行". 或者說, "如何求出一個行列式為1的正交陣, 使得它作用在overrightarrow{OP}的單位向量上, 得到overrightarrow{OQ}的單位向量".

需要說明的是, 當空間的維數大於等於3時, 這樣的旋轉並不是唯一的. (可以想像以下例子, 比如要把赤道上的一點旋轉到北極去, 那麼轉到位之後, 還可以複合上一個以地軸為軸的任意的旋轉)

這事兒可以這麼做.

我們假設overrightarrow{OP}的單位向量為e_1, overrightarrow{OQ}的單位向量為f_1.

在n維向量空間里找一組單位正交基{e_i}_{i=1}^n, 同樣地, 找一組單位正交基{f_i}_{i=1}^n. 使得e_1,f_1是兩組基中的第一個元素, 注意在選取的時候保持這兩組正交基的定向一致(行列式都為1或者都為-1).

這可以通過Gram-Schmidt方法得到. 注意在n=2的情形下, 這樣的基的選取(幾乎)是唯一的(幾乎是指e_2,f_2只有兩種選擇, 而且這兩種選擇本質一樣, 無非是(e_2,f_2)=(u,v)(e_2,f_2)=(-u,-v)而已); 然而在nge 3時, 選擇方式就有無窮多了.

我們的變換可以由基變換誘導, 即

Tleft(sum_{i=1}^nalpha_ie_i
ight)=sum_{i=1}^nalpha_if_i.

具體到題主的例子. e_1=left(dfrac{1}{sqrt{6}},dfrac{1}{sqrt{6}},dfrac{2}{sqrt{6}}
ight), f_1=left(dfrac 13,dfrac 23,dfrac 23
ight).

我們可以e_2=left(dfrac{1}{sqrt{2}},-dfrac{1}{sqrt{2}},0
ight), e_3=left(dfrac{1}{sqrt{3}},dfrac{1}{sqrt{3}},-dfrac{1}{sqrt{3}}
ight);

f_2=left(dfrac{2}{sqrt{5}},-dfrac{1}{sqrt{5}},0
ight), f_3=left(dfrac{2}{3sqrt{5}},dfrac{4}{3sqrt{5}},-dfrac{5}{3sqrt{5}}
ight).


householder變換


剛好這學期學了計算機圖形學,可以來答一下。

你需要的是一個線性變換,可以用矩陣乘法來描述。

B = egin{vmatrix}
x_1  x_2  x_3\ 
y_1  y_2  y_3\ 
z_1  z_2  z_3
end{vmatrix}
ast A

==================先跑個題=================

矩陣乘法的意義是什麼呢?

上面這個矩陣的基本工作就是將A向量的三個正交基底(默認為正則基底Canonical Basis)

e_1=left( 1, 0, 0
ight),e_2=left( 0, 1, 0
ight),e_3=left( 0, 0, 1
ight)

投影到

e_1

用圖像直觀描述就是(圖中看起來像坐標系,然而其實只是互相垂直的三個單位向量,坐標系始終不變)(啊啊啊右邊寫錯了(x1,x2,x3)改為(x1,y1,z1),以此類推)

對於任意一點p,由於其舊坐標

p = left( x, y, z 
ight)

的定義是p = x * e_1 + y * e_2 + z * e_3(這是Column Vector的定義。不要理解為空間中的向量(x,y,z)。在更general的情況下基底可以不互相正交,甚至可以不是空間向量!反正只要滿足向量空間的公理的就可以稱為向量空間,其元素就可以叫向量。比如複數空間在實數域上是一個二維向量空間,在複數域上是一個一維向量空間。在矩陣中真正參與運算的是線性組合的係數們。

在坐標轉換之後,其新坐標則為(注意,一開始基底改變,但係數不變)

egin{align*}
 x * e_1

前後坐標之間的聯繫是

x

也就是說,坐標系變換的第一步是先把老基底(正則基底)變到新基底, 任何點用新基底的線性組合表示的係數不變,然後第二步再把係數換一換,換 回正則基底。

這就是發生在這個矩陣乘法中的那些事:

B = egin{vmatrix}
x_1  x_2  x_3\ 
y_1  y_2  y_3\ 
z_1  z_2  z_3
end{vmatrix}
ast A

==================回到正題的分割線=================

至於題主說的旋轉,我們可以把它拆分為兩個過程:

  1. 把正則基底的z軸旋轉到P=(1,1,2),再求反矩陣M_1,相當於把P轉回正則基底的z軸

  2. 再把正則基底z軸旋轉到Q=(1,2,2),求矩陣M_2

  3. 最後的把兩個矩陣composite一下M=frac{3}{sqrt{6}} *M_2 * M_1,前面的係數是為了照顧一下模長

怎麼做呢?

第一步:很簡單,我只需要確定z軸正則基底有歸宿。

M_{1}^{-1}=egin{vmatrix}
x_1  x_2  1/sqrt{6}  \
y_1  y_2  1/sqrt{6} \
z_1  z_2  2/sqrt{6} \
end{vmatrix}

另外兩個正則基底(x_1, y_1, z_1), (x_2, y_2, z_2)隨意,只要保證和(1,1,2)正交就好了。然後求一下逆矩陣M_1。作為一個orthonormal矩陣肯定是可逆的。

第二步:同樣的道理,我只需要確定z軸正則基底有歸宿。

M_{2}=egin{vmatrix}
x_3  x_4  1/3 \
y_3  y_4  2/3 \
z_3  z_4  2/3 \
end{vmatrix}

跟上面一樣,只要保證三個基底正交就好了。

最後M=frac{3}{sqrt{6}} *M_2*M_1

於是乎Q = frac{3}{sqrt{6}} * M * P = frac{3}{sqrt{6}} * M_2 * M_1 * P = frac{3}{sqrt{6}} * M_2 * (0, 0, sqrt{6}) = (1, 2, 2)

到此就結束了。

如有紕漏,歡迎指出。

===================延伸====================

其實如果只是保證PQ的轉換,那麼矩陣中的基底也不需要正交。不過這樣一來應該就不是『旋轉』,而不是這兩個點的其他點就會變形。


乘一個unitary matrix


三維空間的向量旋轉需要將三維升到四維,用四元數來操作,計算機圖形學裡面的經典向量旋轉,具體的可以參考http://www.zhihu.com/question/23005815/answer/33971127


正交變換


推薦閱讀:

matlab中for循環為什麼會慢?
奇數階幻方構造方法的原理是什麼?
這是用什麼演算法實現的?
遞歸有什麼意義?
計算機是怎樣進行開方和冪運算的?

TAG:演算法 | 數學 | 幾何學 | 解析幾何 |