将向量的差异转换为 0 和 1 之间
converting the difference in vectors to between 0 and 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
感谢您对此的任何帮助!
你本质上需要的是两个向量的角度,你可以从 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
。
这有帮助吗?
了解 Dot product 一般情况下 2 个向量的 点 乘积等于 余弦 之间的夹角2 个向量乘以两个向量的大小(长度)。
dot( A, B ) == | A | * | B | * cos( angle_A_B )
由此可见,2 个单位向量的 点 乘积等于 2 个向量夹角的 余弦 ,因为unit vector 的长度是 1.
uA = normalize( A )
uB = normalize( B )
cos( angle_A_B ) == dot( uA, uB )
如果2个归一化向量指向相同方向,则点积为1,如果指向相反方向,则点积为-1,如果向量垂直则点积为0。
在pygame中,点积可以由math.Vector2.dot()
. If A
and B
are 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
我正在处理两个单位向量,但不确定如何计算。我需要它,这样如果它们指向相同的方向答案是 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-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
。
这有帮助吗?
了解 Dot product 一般情况下 2 个向量的 点 乘积等于 余弦 之间的夹角2 个向量乘以两个向量的大小(长度)。
dot( A, B ) == | A | * | B | * cos( angle_A_B )
由此可见,2 个单位向量的 点 乘积等于 2 个向量夹角的 余弦 ,因为unit vector 的长度是 1.
uA = normalize( A )
uB = normalize( B )
cos( angle_A_B ) == dot( uA, uB )
如果2个归一化向量指向相同方向,则点积为1,如果指向相反方向,则点积为-1,如果向量垂直则点积为0。
在pygame中,点积可以由math.Vector2.dot()
. If A
and B
are 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