在Python中计算两个向量之间的Angular

j9per5c4  于 2023-04-19  发布在  Python
关注(0)|答案(3)|浏览(129)

我试图用Python计算两条线之间的Angular 。我在互联网上搜索并找到了如何做到这一点的公式。但我并不总是得到准确的结果。有些结果显然是错误的,而其他结果似乎是正确的。
我的代码如下:

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

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

eeq64g8w

eeq64g8w1#

如果出现以下情况,则Angular 公式将失败

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

(that如果pt1和pt2位于一条垂直线上),因为你不能被零除。(m2,斜率,将是无限的。)

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

永远为零。所以至少,你的公式可以简化为斜率的反正切。然而,我不会打扰,因为公式并不适用于所有可能的点。
相反,计算两个向量(有向线段)之间的Angular 的更稳健的方法(实际上是标准方法)是使用点积公式:

其中,如果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)
ulydmbyx

ulydmbyx2#

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

import numpy as np
def get_angle(p0, p1=np.array([0,0]), p2=None):
    ''' compute angle (in degrees) for p0p1p2 corner
    Inputs:
        p0,p1,p2 - points in the form of [x,y]
    '''
    if p2 is None:
        p2 = p1 + np.array([1, 0])
    v0 = np.array(p0) - np.array(p1)
    v1 = np.array(p2) - np.array(p1)

    angle = np.math.atan2(np.linalg.det([v0,v1]),np.dot(v0,v1))
    return np.degrees(angle)
polhcujo

polhcujo3#

看起来您使用的是Python2,其中如果两个参数都是int,/将执行整数除法。

from __future__ import division

相关问题