微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决将向量的差值转换为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

谢谢您的帮助!

解决方法

了解Dot product,通常两个矢量的 dot 乘积等于两个矢量之间的角度的 cosine 乘以幅度(长度)。

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

这就是说,两个单位向量的 dot 乘积等于两个向量之间的角度的 cosine ,因为unit vector的长度是1。

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

A dot 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 + 1AB之间的角度线性映射到[0.0,1.0]范围。


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

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

您需要的是两个向量的角度,您可以将其从0-1间隔缩放到0-pi间隔。

您具有以下身份:

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

有帮助吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。