Math 求三维两个单位向量之间的夹角

Math 求三维两个单位向量之间的夹角,math,geometry,3d,Math,Geometry,3d,我正在尝试做一些基本的3D模拟,但自从我在高中学了这些东西已经有20年了 如果我有两个三维向量,我怎么才能找到它们之间的角度。例如,我有一个3,2,1的向量和另一个4,-5,6的向量,我如何找到它们之间的角度(以度或弧度为单位)。如果我记得有一些公式可以做到这一点 谢谢。这就做到了: atan2(sqrt(dot(cross(a, b), cross(a, b))), dot(a, b)) 作为python lambda函数: import math, numpy angle = lambd

我正在尝试做一些基本的3D模拟,但自从我在高中学了这些东西已经有20年了

如果我有两个三维向量,我怎么才能找到它们之间的角度。例如,我有一个3,2,1的向量和另一个4,-5,6的向量,我如何找到它们之间的角度(以度或弧度为单位)。如果我记得有一些公式可以做到这一点

谢谢。

这就做到了:

atan2(sqrt(dot(cross(a, b), cross(a, b))), dot(a, b))
作为python lambda函数:

import math, numpy

angle = lambda a, b: math.atan2(
    math.sqrt(
        numpy.dot(*([numpy.cross(a, b)]*2))
    ), 
    numpy.dot(a, b)
)
结果以弧度为单位:

In : angle([1.,1.,1.], [-1.,1.,1.])
Out: 1.2309594173407747

In : angle([0.,1.,0.], [0.,0.,1.])
Out: 1.5707963267948966
也可以在两个维度上工作:

In : angle([0.,1.], [1.,0.])
Out: 1.5707963267948966

In : angle([0.,1.], [1.,1.])
Out: 0.7853981633974483
这就是诀窍:

atan2(sqrt(dot(cross(a, b), cross(a, b))), dot(a, b))
作为python lambda函数:

import math, numpy

angle = lambda a, b: math.atan2(
    math.sqrt(
        numpy.dot(*([numpy.cross(a, b)]*2))
    ), 
    numpy.dot(a, b)
)
结果以弧度为单位:

In : angle([1.,1.,1.], [-1.,1.,1.])
Out: 1.2309594173407747

In : angle([0.,1.,0.], [0.,0.,1.])
Out: 1.5707963267948966
也可以在两个维度上工作:

In : angle([0.,1.], [1.,0.])
Out: 1.5707963267948966

In : angle([0.,1.], [1.,1.])
Out: 0.7853981633974483

实际上,你应该仔细考虑一下你是否真的需要角度。如果你使用矢量数学,避免在任何可能的情况下转换成角度,那么计算速度会更快。实际上,你应该仔细考虑一下你是否真的需要角度。如果尽可能使用向量数学来避免角度之间的转换,则数学通常更简单,计算速度更快。