兩向量的夾角
2017年06月20日 17:38:11 csxiaoshui 閱讀數:36764
怎么計算兩個向量間的夾角呢?
這里主要分兩種情況,對于二維向量和三維向量來分別討論。
1. 二維向量
二維向量的情況相對簡單,根據向量間的點乘關系
v1?v2=||v1||||v2||cosθ
可以得到:
θ=acos(v1?v2/||v1||||v2||)
如果調用C/C++數學庫函數acos,計算得到的結果的取值范圍在 [0,π]。
?
這里得到的夾角并不在0到360度之間(或者-180到180度),也就是說得到的結果并不能告訴我們v1
在v2前面或者v1在v2
后面,考慮到atan2函數可以用來計算出角度準確處于哪一個象限,可以用atan2來計算夾角。
計算從v2到v1的夾角公式:
θ=atan2(v2.y,v2.x)?atan2(v1.y,v1.x)
?
需要注意的是:atan2的取值范圍是[?π,π]
,在進行相減之后得到的夾角是在[?2π,2π],因此當得到的結果大于π時,對結果減去2π,當結果小于?π時,對結果加上2π
?
2. 三維向量
2.1 使用旋轉軸和旋轉角的方式
旋轉角可以使用上面討論的方式得到:
θ=acos(v1?v2/||v1||||v2||)
旋轉軸是兩個向量的叉乘向量,長度是||v1||||v2||sin(θ)
需要注意的是在acos取值在0度和180度這兩個特殊值的時候,要注意一下,當兩個向量夾角是0度或者180度的時候,它們是平行的關系(同向或者反向),當夾角是0度時,旋轉軸可以是任意軸,因為根本就沒有旋轉。當夾角是180度的時候,旋轉軸只要和向量呈90度夾角即可,可以有無窮多個可能的選擇軸。
?
2.2 使用四元數的方式
使用四元數來旋轉一個向量,使用下面的方式:
p2 = q * p1 * conj(q)
其中:
p2 是旋轉之后的向量
p1是旋轉之前的向量
q是用來旋轉的四元數
在這里知道p2和p1,用來求解四元數還是相當麻煩的。因此一個比較好的思路仍然是使用上面旋轉軸和旋轉角的方式,不過將結論轉換成四元數罷了。
關于轉換的方式,可以參考我寫的另外一篇文章《旋轉變換(三)四元數》
參考文獻:
- Maths - Angle between vectors
- Maths - Trigonometry - Inverse trig functions
- Maths - Issues with Relative Angles