python计算线段夹角
生活随笔
收集整理的這篇文章主要介紹了
python计算线段夹角
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
計算兩條線段之間的夾角
1. 問題與解決思路
如上圖所示,要求圖中線段AB,CD之間的夾角(AB,CD都沒有方向),可以按照如下步驟計算:
2. 具體步驟
首先計算出AB線段與X軸的夾角,將AB線段進行分解,如下圖:
其中角度的計算公式為
?=arctan(dy/dx)
同理求得CD線段與X軸的角度,這里存在一個問題,由于線段不是向量,因此角度可能為60°,也可能為360°-60°=300°,因此后續合并兩個角度的時候需要解決這個問題.
合并的原理也比較簡單,由于用python的math.atan2(y,x)函數計算線段與X軸夾角,返回的角度在[-180,180],也就是說在1,2象限為正數,3,4象限為負數,在合并兩個夾角時考慮正負號,計算完成后再對180°求余即可.
1.3 代碼
import mathclass Point:"""2D坐標點"""def __init__(self, x, y):self.X = xself.Y = yclass Line:def __init__(self, point1, point2):"""初始化包含兩個端點:param point1::param point2:"""self.Point1 = point1self.Point2 = point2def GetAngle(line1, line2):"""計算兩條線段之間的夾角:param line1::param line2::return:"""dx1 = line1.Point1.X - line1.Point2.Xdy1 = line1.Point1.Y - line1.Point2.Ydx2 = line2.Point1.X - line2.Point2.Xdy2 = line2.Point1.Y - line2.Point2.Yangle1 = math.atan2(dy1, dx1)angle1 = int(angle1 * 180 / math.pi)# print(angle1)angle2 = math.atan2(dy2, dx2)angle2 = int(angle2 * 180 / math.pi)# print(angle2)if angle1 * angle2 >= 0:insideAngle = abs(angle1 - angle2)else:insideAngle = abs(angle1) + abs(angle2)if insideAngle > 180:insideAngle = 360 - insideAngleinsideAngle = insideAngle % 180return insideAngleif __name__ == '__main__':L1 = Line(Point(0, 0), Point(-2, 0))L2 = Line(Point(0, 0), Point(2, 0))res = GetAngle(L1, L2)print(res) # 結果為0°總結
以上是生活随笔為你收集整理的python计算线段夹角的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是EasyUI,如何使用EasyUI
- 下一篇: 初识easyUI