我试图用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
问题是我不明白为什么第二个结果,第五个和最后一个都是零。它们相交,因为它们共享一个点,而另一个点没有重复,因为数组中的值不同。
3条答案
按热度按时间eeq64g8w1#
如果出现以下情况,则Angular 公式将失败
(that如果pt1和pt2位于一条垂直线上),因为你不能被零除。(
m2
,斜率,将是无限的。)也
永远为零。所以至少,你的公式可以简化为斜率的反正切。然而,我不会打扰,因为公式并不适用于所有可能的点。
相反,计算两个向量(有向线段)之间的Angular 的更稳健的方法(实际上是标准方法)是使用点积公式:
其中,如果
a = (x1, y1)
,b = (x2, y2)
,则<a,b>
等于x1*x2 + y1*y2
,并且||a||
是向量a
的长度,即sqrt(x1**2 + y1**2)
。ulydmbyx2#
这是我最终使用的,所有使用numpy,范围在-𝛑到之间𝛑
polhcujo3#
看起来您使用的是Python2,其中如果两个参数都是int,
/
将执行整数除法。