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

问题描述 投票:7回答:3

我正在尝试在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

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

python math
3个回答
6
投票

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

from __future__ import division

19
投票

如果您的角度公式将失败,则>

pt2.getX() == pt1.getX()

(即,如果pt1和pt2位于垂直线上),因为您不能除以零。 (m2,斜率将是无限的。)

另外

m1 = (pt1.getY() - pt1.getY())/1

将始终为零。因此,至少,您的公式可以简化为斜率的反正切。但是,我不会打扰,因为该公式不适用于所有可能的点。

相反,用于计算两个向量(直线段)之间的角度的更可靠的方法(实际上是标准方法)是使用dot product formula

“在此处输入图像描述”

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


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)

11
投票

这是我最终使用的,全部使用numpy,范围在-𝛑到𝛑之间

© www.soinside.com 2019 - 2024. All rights reserved.