我试图计算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)
Run Code Online (Sandbox Code Playgroud)
它产生的结果是:
45.0
0.0
45.0
-75.9637565321
0.0
-63.4349488229
0.0
Run Code Online (Sandbox Code Playgroud)
问题是我不明白为什么第二个结果,第五个和最后一个结果被归零,因为它们共享一个点而另一个点没有重复,因为数组中的值是不同的.
unu*_*tbu 19
如果您的角度公式将失败
pt2.getX() == pt1.getX()
Run Code Online (Sandbox Code Playgroud)
(也就是说,如果pt1和pt2位于垂直线上),因为你不能除以零.(m2
,斜率,将是无限的.)
也
m1 = (pt1.getY() - pt1.getY())/1
Run Code Online (Sandbox Code Playgroud)
将永远为零.所以至少,你的公式可以简化为斜坡的arctan.但是,我不打扰,因为该公式不适用于所有可能的点.
取而代之的是,用于计算(定向线段)两个向量之间的角度的更鲁棒的方法(实际上,标准方法)是使用点积公式:
其中if 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)
Run Code Online (Sandbox Code Playgroud)
das*_*esy 11
这是我最终使用的,所有使用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)
Run Code Online (Sandbox Code Playgroud)
看起来你正在使用Python2,/
如果两个参数都是int,那么将执行整数除法.要获得Python3的行为,可以将其放在文件的顶部
from __future__ import division
Run Code Online (Sandbox Code Playgroud)