Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将向量差转换为介于0和1之间_Python_Math_Pygame_Trigonometry - Fatal编程技术网

Python 将向量差转换为介于0和1之间

Python 将向量差转换为介于0和1之间,python,math,pygame,trigonometry,Python,Math,Pygame,Trigonometry,我正在使用两个单位向量,但不确定如何计算。我需要它,如果它们指向同一个方向,答案是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间隔 您具

我正在使用两个单位向量,但不确定如何计算。我需要它,如果它们指向同一个方向,答案是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.

从中可以得到
cos(gamma)
,因此
gamma

这有帮助吗?

阅读有关矢量的内容。通常,两个矢量的点积等于两个矢量之间的夹角的余弦乘以两个矢量的大小(长度)

dot( A, B ) == | A | * | B | * cos( angle_A_B ) 
因此,2个单位向量的点积等于2个向量之间夹角的余弦,因为a的长度为1

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

在pygame中,点积可以通过以下公式计算。如果
A
B
是对象:

uA=A.normalize()
uB=B.正常化()
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]范围内


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

w=1-A.角度u至(B)/180

您要查找的实际上只是两个向量之间的角度。当然,角度将在[0,180°]范围内(如果以弧度表示,则为[0,Pi])。将结果除以180(或π),可以得到[0,1]范围内的所需结果。关于向量之间的角度,寻找例如点积:cos alpha=p*q/(| p |*| q |),如果你知道你有单位向量,你可以省略下半部分->它将被1*1除。)谢谢,但它在1和-1之间波动,我需要在1和0之间。但这很有帮助@太极法金如果
AdotB
在范围[-1,1]内,那么
AdotB*0.5+0.5
在范围[0,1]内。啊,我明白了。很抱歉错过了。谢谢,太好了@从你的例子来看,太极拳的角度是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)
dot( A, B ) == | A | * | B | * cos( angle_A_B ) 
uA = normalize( A )
uB = normalize( B )
cos( angle_A_B ) == dot( uA, uB )