我正在研究空间分析问题,该工作流程的一部分是计算连接线段之间的角度。
每条线段仅由两个点组成,每个点都有一对 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 范围内的正值? 如果不是,我应该采取什么样的其他方法?