将向量的差异转换为 0 和 1 之间

converting the difference in vectors to between 0 and 1

我正在处理两个单位向量,但不确定如何计算。我需要它,这样如果它们指向相同的方向答案是 1,相反的方向答案是 0,垂直(向上或向下)答案是 0.5,等等

例子: 对于两个向量 (1,0) 和 (-1,0)(因此,向量相反),我得到的答案是 0。 对于两个向量 (1,0) 和 (1/sqrt(2),1/sqrt(2))(因此,单位向量指向 45 度角)我得到 0.25。 对于两个向量 (0,1) 和 (-1,0)(所以,垂直向量)我得到 0.5

感谢您对此的任何帮助!

你本质上需要的是两个向量的角度,你可以从 0-pi 间隔到你的 0-1 间隔的比例。

您有以下身份:

a dot b = norm(a)*norm(b)*cos(gamma), and in this case:
a dot b = cos(gamma), because they are unit vectors.

a dot b = ax*bx+ay*by

据此你有 cos(gamma),因此 gamma

这有帮助吗?

了解 Dot product 一般情况下 2 个向量的 乘积等于 余弦 之间的夹角2 个向量乘以两个向量的大小(长度)。

dot( A, B ) == | A | * | B | * cos( angle_A_B ) 

由此可见,2 个单位向量的 乘积等于 2 个向量夹角的 余弦 ,因为unit vector 的长度是 1.

uA = normalize( A )
uB = normalize( B )
cos( angle_A_B ) == dot( uA, uB )

如果2个归一化向量指向相同方向,则点积为1,如果指向相反方向,则点积为-1,如果向量垂直则点积为0。

在pygame中,点积可以由math.Vector2.dot(). If A and B are pygame.math.Vector2个对象计算:

uA = A.normalize()
uB = B.normalize()
AdotB = uA.dot(uB)

在上面的示例中,AdotB 在 [-1.0, 1.0] 范围内。 AdotB * 0.5 + 0.5 在 [0.0, 1.0] 范围内,math.acos(AdotB) / math.pi + 1AB 之间的角度线性映射到范围 [0.0, 1.0]。


此外,pygame.math.Vector2.angle_to() 计算给定矢量的角度(以度为单位)。根据角度 [0.0, 2.0] 范围内的值可以通过

计算
w = 1 - A.angle_to(B) / 180