首页 > 解决方案 > 将向量的差异转换为 0 和 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

感谢您对此的任何帮助!

标签: pythonmathpygametrigonometry

解决方案


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

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

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

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

A 点 B

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

在 pygame 中,点积可以通过math.Vector2.dot(). 如果ABpygame.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 + 1并将角度映射到范围 [0.0, 1.0] 之间AB线性映射到范围 [0.0, 1.0]。


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

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

推荐阅读