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

tai*_*jin 2 python math pygame trigonometry

我正在处理两个单位向量,但不确定如何计算。我需要它,以便如果它们指向同一方向,则答案为 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

感谢您对此的任何帮助!

Rab*_*d76 5

阅读有关点积的信息一般而言,2 个向量的积等于2 个向量之间的夹角的余弦乘以两个向量的幅度(长度)。

dot( A, B ) == | A | * | B | * cos( angle_A_B ) 
Run Code Online (Sandbox Code Playgroud)

因此,2 个单位向量的积等于2 个向量之间夹角的余弦,因为单位向量的长度是 1。

uA = normalize( A )
uB = normalize( B )
cos( angle_A_B ) == dot( uA, uB )
Run Code Online (Sandbox Code Playgroud)

一个点 B

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

在 pygame 中,点积可以通过 计算math.Vector2.dot()。如果ABpygame.math.Vector2对象:

dot( A, B ) == | A | * | B | * cos( angle_A_B ) 
Run Code Online (Sandbox Code Playgroud)

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


此外,pygame.math.Vector2.angle_to()计算给定向量的角度(以度为单位)。取决于角度的 [0.0, 2.0] 范围内的值可以通过以下方式计算

uA = normalize( A )
uB = normalize( B )
cos( angle_A_B ) == dot( uA, uB )
Run Code Online (Sandbox Code Playgroud)