两向量的夹角
2017-06-20 17:38
176 查看
怎么计算两个向量间的夹角呢?
这里主要分两种情况,对于二维向量和三维向量来分别讨论。
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π
θ=acos(v1⋅v2/||v1||||v2||)
旋转轴是两个向量的叉乘向量,长度是||v1||||v2||sin(θ)
需要注意的是在acos取值在0度和180度这两个特殊值的时候,要注意一下,当两个向量夹角是0度或者180度的时候,它们是平行的关系(同向或者反向),当夹角是0度时,旋转轴可以是任意轴,因为根本就没有旋转。当夹角是180度的时候,旋转轴只要和向量呈90度夹角即可,可以有无穷多个可能的选择轴。
p2 = q * p1 * conj(q)
其中:
p2 是旋转之后的向量
p1是旋转之前的向量
q是用来旋转的四元数
在这里知道p2和p1,用来求解四元数还是相当麻烦的。因此一个比较好的思路仍然是使用上面旋转轴和旋转角的方式,不过将结论转换成四元数罢了。
关于转换的方式,可以参考我写的另外一篇文章《旋转变换(三)四元数》
参考文献:
Maths - Angle between vectors
Maths - Trigonometry - Inverse trig functions
Maths - Issues with Relative Angles
这里主要分两种情况,对于二维向量和三维向量来分别讨论。
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
相关文章推荐
- 用Python计算两个向量之间的夹角余弦值
- CCGeometry(几何学。CCPoint两向量夹角、投影向量、以特定轴+角度旋转。CCSize-大小概念。CCRect-成员是前2.函数:是否包含一个ccp,是否和另一rect相交。宏xMake)
- 点积应用-求两个向量夹角
- c++做一个计算两向量夹角的程序
- 求两个向量夹角
- 点积应用-求两个向量夹角
- 向量内积和夹角的关系
- Unity 求两个向量间夹角
- 求向量夹角
- u3d计算向量间夹角
- 两个向量的夹角(顺时针)
- 两个单位向量的 夹角余弦 加上 欧式距离平方的一半 等于 1
- 分享:用Python计算两个向量之间的夹角余弦值
- 《3D数学基础》系列视频 1.5 向量的夹角
- poj 3129 How I Wonder What You Are! 点积求两向量夹角
- 向量夹角
- U3D-根据两2D向量,求最小夹角
- 解释脚本语言 计算两个向量的夹角度数。
- <模板><计算几何>求两向量夹角
- POJ Space Ant (向量夹角)