Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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中三个点之间的角度-为什么会出现这种结果?_Python_Math_Angle - Fatal编程技术网

python中三个点之间的角度-为什么会出现这种结果?

python中三个点之间的角度-为什么会出现这种结果?,python,math,angle,Python,Math,Angle,我试着计算点A、B和C之间的角度ABC。我知道数学很基本,但我不明白为什么我的函数给出了错误的结果。首先,这里是代码(a包含一个列表[x,y,z]) 此函数给出错误的结果。事实上,如果我将第二个向量从bc更改为cb,它会给出很好的结果: cb = [b[0]-c[0], b[1]-c[1], b[2]-c[2]] 我不明白为什么,就像我学数学一样,我的第一个解决方案应该能很好地工作,并给出好的结果 首先,您的代码非常不符合Python。这里有一个建议: from math import

我试着计算点A、B和C之间的角度ABC。我知道数学很基本,但我不明白为什么我的函数给出了错误的结果。首先,这里是代码(
a
包含一个列表
[x,y,z]

此函数给出错误的结果。事实上,如果我将第二个向量从
bc
更改为
cb
,它会给出很好的结果:

    cb = [b[0]-c[0], b[1]-c[1], b[2]-c[2]]

我不明白为什么,就像我学数学一样,我的第一个解决方案应该能很好地工作,并给出好的结果

首先,您的代码非常不符合Python。这里有一个建议:

from math import sqrt, acos
def angle(a, b, c):
    
    # Create vectors from points
    ba = [ aa-bb for aa,bb in zip(a,b) ]
    bc = [ cc-bb for cc,bb in zip(c,b) ]
    
    # Normalize vector
    nba = sqrt ( sum ( (x**2.0 for x in ba) ) )
    ba = [ x/nba for x in ba ]
    
    nbc = sqrt ( sum ( (x**2.0 for x in bc) ) )
    bc = [ x/nbc for x in bc ]
    
    # Calculate scalar from normalized vectors
    scalar = sum ( (aa*bb for aa,bb in zip(ba,bc)) )
    
    # calculate the angle in radian
    angle = acos(scalar)
    return angle
其次,您的代码可能返回了正确的角度,但可能不是您期望的角度

假设出现这种情况:

A-----C
|    /
|   /
|  /
| /
|/
B

你正在计算的角度是B处的底角,而不是A处的左上角,这通常是人们在将三个向量(A、B、c)传递到返回角度的函数中时想要的角度。

首先,你的代码非常不符合Python。这里有一个建议:

from math import sqrt, acos
def angle(a, b, c):
    
    # Create vectors from points
    ba = [ aa-bb for aa,bb in zip(a,b) ]
    bc = [ cc-bb for cc,bb in zip(c,b) ]
    
    # Normalize vector
    nba = sqrt ( sum ( (x**2.0 for x in ba) ) )
    ba = [ x/nba for x in ba ]
    
    nbc = sqrt ( sum ( (x**2.0 for x in bc) ) )
    bc = [ x/nbc for x in bc ]
    
    # Calculate scalar from normalized vectors
    scalar = sum ( (aa*bb for aa,bb in zip(ba,bc)) )
    
    # calculate the angle in radian
    angle = acos(scalar)
    return angle
其次,您的代码可能返回了正确的角度,但可能不是您期望的角度

假设出现这种情况:

A-----C
|    /
|   /
|  /
| /
|/
B

你正在计算的角度是B处的底角,而不是A处的左上角,这通常是人们在将三个向量(A、B、c)传递到返回角度的函数中时想要的角度。

首先,你的代码非常不符合Python。这里有一个建议:

from math import sqrt, acos
def angle(a, b, c):
    
    # Create vectors from points
    ba = [ aa-bb for aa,bb in zip(a,b) ]
    bc = [ cc-bb for cc,bb in zip(c,b) ]
    
    # Normalize vector
    nba = sqrt ( sum ( (x**2.0 for x in ba) ) )
    ba = [ x/nba for x in ba ]
    
    nbc = sqrt ( sum ( (x**2.0 for x in bc) ) )
    bc = [ x/nbc for x in bc ]
    
    # Calculate scalar from normalized vectors
    scalar = sum ( (aa*bb for aa,bb in zip(ba,bc)) )
    
    # calculate the angle in radian
    angle = acos(scalar)
    return angle
其次,您的代码可能返回了正确的角度,但可能不是您期望的角度

假设出现这种情况:

A-----C
|    /
|   /
|  /
| /
|/
B

你正在计算的角度是B处的底角,而不是A处的左上角,这通常是人们在将三个向量(A、B、c)传递到返回角度的函数中时想要的角度。

首先,你的代码非常不符合Python。这里有一个建议:

from math import sqrt, acos
def angle(a, b, c):
    
    # Create vectors from points
    ba = [ aa-bb for aa,bb in zip(a,b) ]
    bc = [ cc-bb for cc,bb in zip(c,b) ]
    
    # Normalize vector
    nba = sqrt ( sum ( (x**2.0 for x in ba) ) )
    ba = [ x/nba for x in ba ]
    
    nbc = sqrt ( sum ( (x**2.0 for x in bc) ) )
    bc = [ x/nbc for x in bc ]
    
    # Calculate scalar from normalized vectors
    scalar = sum ( (aa*bb for aa,bb in zip(ba,bc)) )
    
    # calculate the angle in radian
    angle = acos(scalar)
    return angle
其次,您的代码可能返回了正确的角度,但可能不是您期望的角度

假设出现这种情况:

A-----C
|    /
|   /
|  /
| /
|/
B


您计算的角度是B处的底角,而不是A处的左上角,这通常是人们在将三个向量(A、B、c)传递到返回角度的函数中时所需要的角度。

我看不出此代码有任何问题–输入和预期输出是什么?你描述的改变修正了它给出的πθ(如果θ是你想要的角度)。好的,我想问题是我在寻找向量ba和bc之间的角度,但它不是这样工作的。我必须得到ab和bc之间的角度才能得到ABC。我看不出这个代码有任何问题——输入和预期输出是什么?你描述的改变修正了它给出的πθ(如果θ是你想要的角度)。好的,我想问题是我在寻找向量ba和bc之间的角度,但它不是这样工作的。我必须得到ab和bc之间的角度才能得到ABC。我看不出这个代码有任何问题——输入和预期输出是什么?你描述的改变修正了它给出的πθ(如果θ是你想要的角度)。好的,我想问题是我在寻找向量ba和bc之间的角度,但它不是这样工作的。我必须得到ab和bc之间的角度才能得到ABC。我看不出这个代码有任何问题——输入和预期输出是什么?你描述的改变修正了它给出的πθ(如果θ是你想要的角度)。好的,我想问题是我在寻找向量ba和bc之间的角度,但它不是这样工作的。我必须得到ab和bc之间的角度才能得到ABC。我想你错过了一些
sqrt
调用。你忘记了
sqrt
要标准化的
sum
。无论如何,我将进一步定义一个normalize函数,以避免两次键入逻辑,并使用
scal=sum(aa*bb代表aa,bb在zip中(normalize(b,a),normalize(b,c))
Oops调用它。是的,忘了。我尽量不偏离他的原始代码,所以我没有在函数中分离它们。实际上,他应该只使用numpy。我认为你错过了一些
sqrt
调用。你忘记了
sqrt
要标准化的平方和。无论如何,我将进一步定义一个normalize函数,以避免两次键入逻辑,并使用
scal=sum(aa*bb代表aa,bb在zip中(normalize(b,a),normalize(b,c))
Oops调用它。是的,忘了。我尽量不偏离他的原始代码,所以我没有在函数中分离它们。实际上,他应该只使用numpy。我认为你错过了一些
sqrt
调用。你忘记了
sqrt
要标准化的平方和。无论如何,我将进一步定义一个normalize函数,以避免两次键入逻辑,并使用
scal=sum(aa*bb代表aa,bb在zip中(normalize(b,a),normalize(b,c))
Oops调用它。是的,忘了。我尽量不偏离他的原始代码,所以我没有在函数中分离它们。实际上,他应该只使用numpy。我认为你错过了一些
sqrt
调用。你忘记了
sqrt
要标准化的平方和。无论如何,我将进一步定义一个normalize函数,以避免两次键入逻辑,并使用
scal=sum(aa*bb代表aa,bb在zip中(normalize(b,a),normalize(b,c))
Oops调用它。是的,忘了。我尽量不偏离他的原始代码,所以我没有在函数中分离它们。事实上,他应该只使用numpy。