Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.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 - Fatal编程技术网

在python中计算两个向量之间的角度

在python中计算两个向量之间的角度,python,math,Python,Math,我试图用python计算两条直线之间的角度。 我在网上搜索,找到了如何做的方程式。但我并不总能得到准确的结果。有些结果显然是错误的,而另一些结果似乎是正确的。 我的代码如下: def angle(pt1,pt2): m1 = (pt1.getY() - pt1.getY())/1 m2 = (pt2.getY() - pt1.getY())/(pt2.getX()-pt1.getX()) tnAngle = (m1-m2)/(1+(m1*m2)) return

我试图用python计算两条直线之间的角度。 我在网上搜索,找到了如何做的方程式。但我并不总能得到准确的结果。有些结果显然是错误的,而另一些结果似乎是正确的。 我的代码如下:

def angle(pt1,pt2):
    m1 = (pt1.getY() - pt1.getY())/1
    m2 = (pt2.getY() - pt1.getY())/(pt2.getX()-pt1.getX())

    tnAngle = (m1-m2)/(1+(m1*m2))
    return math.atan(tnAngle)

def calculate(pt,ls):
    i=2
    for x in ls:
        pt2 = point(x,i)
        i=i+1
        ang = angle(pt,pt2)*180/math.pi
        ang = ang * (-1)
        print ang


pt = point(3,1)
ls = [1,7,0,4,9,6,150]

calculate(pt,ls)
它产生的结果是:

45.0
0.0
45.0
-75.9637565321
0.0
-63.4349488229
0.0

问题是,我不明白为什么第二个结果、第五个结果和最后一个结果是零,它们相交,因为它们共享一个点,而另一个点不重复,因为数组中的值不同。

看起来您使用的是Python2,如果两个参数都是int,则
/
将进行整数除法。要获得Python3的行为,可以将其放在文件的顶部

from __future__ import division

如果

pt2.getX() == pt1.getX()
(也就是说,如果pt1和pt2位于一条垂直线上),因为你不能除以零。(
m2
,斜率是无限的。)

将始终为零。所以,至少,你的公式可以简化为斜率的arctan。然而,我不想麻烦,因为公式并不适用于所有可能的点

相反,计算两个矢量(有向线段)之间的角度的更稳健的方法(实际上是标准方法)是使用:

其中,如果
a=(x1,y1)
b=(x2,y2)
,则
等于
x1*x2+y1*y2
,并且
|| a |
是向量
a
的长度,即
sqrt(x1**2+y1**2)



这是我最后使用的,全部使用numpy,范围在-第二行非常可疑。这真的是你想要做的吗?
math.hypot(x1,y1)
是tidier应该引发异常,因为当任一向量的长度为零时,没有定义角度。我可能错了,但我认为angle()返回的结果的符号可能有问题。如果第一个点是(1.0,0.0),第二个点是(1.0,-1.0),那么角度的符号不应该是负的(或315度)?我认为这可以简单地通过将最后一行替换为
return math.copysign(math.acos(内积/(len1*len2)),y2)
@Bill:上面的函数计算两个向量之间的角度。根据定义,该角度始终是较小的角度,介于0和pi弧度之间。它具有两个向量之间的角度在旋转时不变的特性。例如,如果我们将两个向量旋转180度,
角度((1,0)、(1,-1))
仍然等于
角度((-1,0),(-1,1))
。如果我们把它改成你的公式,那么角度就会改变符号。另外,
角度(A,B)=角度(B,A)
。你的不是可交换的。没关系,听起来你在寻找不同于两个向量夹角的东西。
m1 = (pt1.getY() - pt1.getY())/1
import math

def angle(vector1, vector2):
    x1, y1 = vector1
    x2, y2 = vector2
    inner_product = x1*x2 + y1*y2
    len1 = math.hypot(x1, y1)
    len2 = math.hypot(x2, y2)
    return math.acos(inner_product/(len1*len2))

def calculate(pt, ls):
    i = 2
    for x in ls:
        pt2 = (x, i)
        i += 1
        ang = math.degrees(angle(pt, pt2))
        ang = ang * (-1)
        print(ang)

pt = (3, 1)
ls = [1,7,0,4,9,6,150]

calculate(pt, ls)