【问题标题】:converting the difference in vectors to between 0 and 1将向量的差异转换为 0 和 1 之间
【发布时间】:2020-09-22 20:21:27
【问题描述】:

我正在使用两个单位向量,但不确定如何计算。我需要它,这样如果他们指向相同的方向答案是 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, 180°] 范围内(如果以弧度表示,则为 [0, Pi])。将结果除以 180(或 Pi),您将得到 [0, 1] 范围内的所需结果。关于向量之间的角度,寻找例如点积:cos alpha = p * q / (| p | * | q |) 如果你知道你有单位向量,你可以省略下部 -> 它会除以 1 * 1。)

标签: python math pygame trigonometry


【解决方案1】:

阅读Dot product 一般情况下,2 个向量的 积等于 2 个向量之间的夹角的 余弦 乘以两个向量。

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

因此,2 个单位向量的 dot 乘积等于 2 个向量之间夹角的 cosine,因为 unit vector 的长度为 1 .

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

如果两个归一化向量指向同一方向,则点积为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

【讨论】:

  • 谢谢,但它在 1 和 -1 之间波动,我需要在 1 和 0 之间。但这很有帮助!
  • @taijifajin 如果AdotB在[-1, 1]范围内,那么AdotB*0.5+0.5在[0, 1]范围内。
  • 啊,我明白了。很抱歉错过了。谢谢,太完美了!
  • @taijifajin 从您的示例中角度为 45°,看起来您想要的是角度,而不是点积。所以acos(AdotB) / pi + 1 似乎比(AdotB + 1) / 2 更适合您的需求。
  • 感谢 Stef,当我开始使用不同的数字时,我意识到这些都不起作用。这实际上是可行的(至少对于右、上、左、下以及它们之间的 4 个点):A = Vector2(1,0) B = Vector2(5,0) uA = A。 normalize() uB = B.normalize() w = 1 - uA.angle_to(uB) / 180 如果 w > 1: w = 2 - w print(w)
【解决方案2】:

你最需要的是两个向量的角度,你可以从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

这有帮助吗?

【讨论】:

    猜你喜欢
    • 2022-09-23
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多