如何用python画钝角三角形_使用math.atan2计算线段(Python)之间的角度

这篇博客探讨了在二维空间分析中遇到的问题,特别是计算线段之间的角度。作者指出,由于线段端点顺序的不同,使用math.atan2计算角度时会得到正负值,且不在0到180度范围内。为了解决这个问题,他们寻求一种方法来确保无论线段顺序如何,都能得到0到180度的正角度。博客中展示了多种线段排列组合及其对应计算结果,并表达了对找到离散解决方案的需求。
摘要由CSDN通过智能技术生成

我正在研究空间分析问题,该工作流程的一部分是计算连接线段之间的角度.

每个线段仅由两个点组成,每个点都有一对XY坐标(笛卡尔坐标).这是GeoGebra的图像.我总是对在0到180范围内获得正角度感兴趣.但是,根据输入线段中顶点的顺序,我得到所有类型的角度.

我使用的输入数据以坐标元组的形式提供.根据顶点创建顺序,每个线段的最后/结束点可以不同.以下是Python代码中的一些案例.我得到它们的线段的顺序是随机的,但在元组的元组中,第一个元素是起点,第二个元素是终点.例如,DE线段将具有((1,1.5),(2,2))并且(1,1.5)是起点,因为它具有坐标元组中的第一个位置.

但是我需要确保在DE,DF和ED,DF等之间获得相同的角度.

vertexType = "same start point; order 1"

#X, Y X Y coords

lineA = ((1,1.5),(2,2)) #DE

lineB = ((1,1.5),(2.5,0.5)) #DF

calcAngle(lineA, lineB,vertexType)

#flip lines order

vertexType = "same start point; order 2"

lineB = ((1,1.5),(2,2)) #DE

lineA = ((1,1.5),(2.5,0.5)) #DF

calcAngle(lineA, lineB,vertexType)

vertexType = "same end point; order 1"

lineA = ((2,2),(1,1.5)) #ED

lineB = ((2.5,0.5),(1,1.5)) #FE

calcAngle(lineA, lineB,vertexType)

#flip lines order

vertexType = "same end point; order 2"

lineB = ((2,2),(1,1.5)) #ED

lineA = ((2.5,0.5),(1,1.5)) #FE

calcAngle(lineA, lineB,vertexType)

vertexType = "one line after another - down; order 1"

lineA = ((2,2),(1,1.5)) #ED

lineB = ((1,1.5),(2.5,0.5)) #DF

calcAngle(lineA, lineB,vertexType)

#flip lines order

vertexType = "one line after another - down; order 2"

lineB = ((2,2),(1,1.5)) #ED

lineA = ((1,1.5),(2.5,0.5)) #DF

calcAngle(lineA, lineB,vertexType)

vertexType = "one line after another - up; line order 1"

lineA = ((1,1.5),(2,2)) #DE

lineB = ((2.5,0.5),(1,1.5)) #FD

calcAngle(lineA, lineB,vertexType)

#flip lines order

vertexType = "one line after another - up; line order 2"

lineB = ((1,1.5),(2,2)) #DE

lineA = ((2.5,0.5),(1,1.5)) #FD

calcAngle(lineA, lineB,vertexType)

我写了一个很小的函数,它将行的组合作为args并计算它们之间的角度.我使用的math.atan2似乎最适合这个.

def calcAngle(lineA,lineB,vertexType):

line1Y1 = lineA[0][1]

line1X1 = lineA[0][0]

line1Y2 = lineA[1][1]

line1X2 = lineA[1][0]

line2Y1 = lineB[0][1]

line2X1 = lineB[0][0]

line2Y2 = lineB[1][1]

line2X2 = lineB[1][0]

#calculate angle between pairs of lines

angle1 = math.atan2(line1Y1-line1Y2,line1X1-line1X2)

angle2 = math.atan2(line2Y1-line2Y2,line2X1-line2X2)

angleDegrees = (angle1-angle2) * 360 / (2*math.pi)

print angleDegrees, vertexType

我得到的输出是:

> -299.744881297 same start point; order 1

> 299.744881297 same start point; order 2

> 60.2551187031 same end point; order 1

> -60.2551187031 same end point; order 2

> -119.744881297 one line after another - down; order 1

> 119.744881297 one line after another - down; order 2

> -119.744881297 one line after another - up; line order 1

> 119.744881297 one line after another - up; line order 2

如您所见,我将获得不同的值,具体取决于线段和线段顺序中的顶点顺序.我试图通过找出源线有什么样的关系和翻转线,编辑角度等来对角度进行后处理.我已经结束了十几个这样的情况,并且在某些时候它们开始重叠而且我不能再发现-119.744是否应该变成60.255(锐角)或者是119.744(钝角)等.

有没有任何离散的方法来处理我从math.atan2收到的输出角度值,只能获得0到180范围内的正值?如果没有,我应该采取什么样的其他方法?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值