Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 求向量间的符号角_Java_Python_Math_Trigonometry_Angle - Fatal编程技术网

Java 求向量间的符号角

Java 求向量间的符号角,java,python,math,trigonometry,angle,Java,Python,Math,Trigonometry,Angle,如何求从向量a到b的有符号角θ 是的,我知道θ=arccos((a.b)/(a | | | b |)) 但是,它不包含符号(即,它不区分顺时针或逆时针旋转) 我需要能告诉我从a到b旋转的最小角度的东西。正号表示从+x轴向+y轴旋转。相反,负号表示从+x轴向-y轴旋转 assert angle((1,0),(0,1)) == pi/2. assert angle((0,1),(1,0)) == -pi/2. 如果您选择的数学库中有一个atan2()函数: signed_angle = atan2

如何求从向量a到b的有符号角θ

是的,我知道θ=arccos((a.b)/(a | | | b |))

但是,它不包含符号(即,它不区分顺时针或逆时针旋转)

我需要能告诉我从a到b旋转的最小角度的东西。正号表示从+x轴向+y轴旋转。相反,负号表示从+x轴向-y轴旋转

assert angle((1,0),(0,1)) == pi/2.
assert angle((0,1),(1,0)) == -pi/2.
如果您选择的数学库中有一个atan2()函数:

signed_angle = atan2(b.y,b.x) - atan2(a.y,a.x)

你想要使用的通常被称为“perp点积”,也就是说,找到垂直于其中一个向量的向量,然后找到与另一个向量的点积

if(a.x*b.y - a.y*b.x < 0)
    angle = -angle;

那么a=(-1,1)和b=(-1,-1)呢,答案应该是π/2?您应该检查绝对值是否大于π,如果大于π,则加上或减去2*π。@Derek捕捉得好。事实上,我自己在实现解决方案时发现了这一点。例如,对于计算机图形学来说,这不太合适,因为如果我有a={1,0}和b={0,1},它会混淆-pi和pi[-180,180),但有一段时间我发现结果是:358.5。德里克·莱德贝特的答案很好。角度将介于-pi和pi弧度之间。伙计,这就是我所需要的!在2d中完美无瑕,谢谢!所有其他重复的问题都应该链接到这个问题和这个答案;这是如此稀少的记录(甚至没有维基百科的文章)你能详细说明第二个版本是如何工作的吗?特别是你传递给atan2的计算。@Tara第一个参数是行列式,第二个参数是点积。另请参阅。
angle = atan2( a.x*b.y - a.y*b.x, a.x*b.x + a.y*b.y );