直接计算2个向量之间的顺时针角度 [英] Direct way of computing clockwise angle between 2 vectors

查看:1486
本文介绍了直接计算2个向量之间的顺时针角度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想找出2个向量(2D,3D)之间的顺时针角度。



点产品的clasic方法给出了内角(0-180度),我需要使用一些if语句来确定结果是否为角度I需要或其补充。



你知道直接计算顺时针角度的方法吗?

解决方案

2D case



就像点击产品与角度的余弦,行列式是其正弦的。所以你可以这样计算角度:

  dot = x1 * x2 + y1 * y2#dot product 
det = x1 * y2-y1 * x2#determinant
angle = atan2(det,dot)#atan2(y,x)or atan2(sin,cos)



3D case



在3D中,两个任意放置的向量定义了它们自己的旋转轴,垂直于两者。该旋转轴不具有固定的取向,这意味着您不能唯一地固定旋转角的方向。一个常见的惯例是使角度总是正的,并且以使得其适合正角度的方式定向轴线。在这种情况下,归一化向量的点积足以计算角度。

  dot = x1 * x2 + y1 * y2 + z1 * z2 
lenSq1 = x1 * x1 + y1 * y1 + z1 * z1
lenSq2 = x2 * x2 + y2 * y2 + z2 * z2
angle = acos(dot / sqrt lenSq1 * lenSq2))



嵌入3D平面



一种特殊情况是,您的向量不是任意放置,而是位于具有已知法向量 n 的平面内。然后,旋转轴也将沿方向n ,并且 n 的方向将固定该轴的方向。在这种情况下,您可以调整上述2D计算,包括 n 行列式中它的大小为3×3。

  dot = x1 * x2 + y1 * y2 + z1 * z2 
det = x1 * y2 * zn + x2 * yn * z1 + xn * y1 * z2-z1 * y2 * xn-z2 * yn * x1-zn * y1 * x2
angle = atan2(det,dot)


$ b 这个工作的一个条件是法向量 n 有单位长度。



作为三重产品



这个行列式也可以表示作为三重产品,作为 @Excrubulent 在建议的修改中指出。

  det = n·(v1×v2)

这在一些API中可能更容易实现,并给出了不同的观点:乘积与角度的正弦成正比,并且将垂直于平面,因此是n的倍数。因此,点积将基本上测量该向量的长度,但是带有正确的符号。


I want to find out the clockwise angle between 2 vectors(2D, 3D).

The clasic way with the dot product gives me the inner angle(0-180 degrees) and I need to use some if statements to determine if the result is the angle I need or its complement.

Do you know a direct way of computing clockwise angle?

解决方案

2D case

Just like the dot product is proportional to the cosine of the angle, the determinant is proprortional to its sine. So you can compute the angle like this:

dot = x1*x2 + y1*y2      # dot product
det = x1*y2 - y1*x2      # determinant
angle = atan2(det, dot)  # atan2(y, x) or atan2(sin, cos)

3D case

In 3D, two arbitrarily placed vectors define their own axis of rotation, perpendicular to both. That axis of rotation does not come with a fixed orientation, which means that you cannot uniquely fix the direction of the angle of rotation either. One common convention is to let angles be always positive, and to orient the axis in such a way that it fits a positive angle. In this case, the dot product of the normalized vectors is enough to compute angles.

dot = x1*x2 + y1*y2 + z1*z2
lenSq1 = x1*x1 + y1*y1 + z1*z1
lenSq2 = x2*x2 + y2*y2 + z2*z2
angle = acos(dot/sqrt(lenSq1 * lenSq2))

Plane embedded in 3D

One special case is the case where your vectors are not placed arbitrarily, but lie within a plane with a known normal vector n. Then the axis of rotation will be in direction n as well, and the orientation of n will fix an orientation for that axis. In this case, you can adapt the 2D computation above, including n into the determinant to make its size 3×3.

dot = x1*x2 + y1*y2 + z1*z2
det = x1*y2*zn + x2*yn*z1 + xn*y1*z2 - z1*y2*xn - z2*yn*x1 - zn*y1*x2
angle = atan2(det, dot)

One condition for this to work is that the normal vector n has unit length. If not, you'll have to normalize it.

As triple product

This determinant could also be expressed as the triple product, as @Excrubulent pointed out in a suggested edit.

det = n · (v1 × v2)

This might be easier to implement in some APIs, and gives a different perspective on what's going on here: The cross product is proportional to the sine of the angle, and will lie perpendicular to the plane, hence be a multiple of n. The dot product will therefore basically measure the length of that vector, but with the correct sign attached to it.

这篇关于直接计算2个向量之间的顺时针角度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆