如何解决将向量的差值转换为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 )
如果2个归一化矢量指向相同方向,则点积为1;如果指向相反方向,则点积为-1;如果矢量垂直,则点积为0。
在pygame中,点积可以由math.Vector2.dot()
计算。如果A
和B
是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 + 1
将A
和B
之间的角度线性映射到[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 举报,一经查实,本站将立刻删除。