python計算線段夾角

2021-09-28 23:07:22 字數 2103 閱讀 9294

如上圖所示,要求圖中線段ab,cd之間的夾角(ab,cd都沒有方向),可以按照如下步驟計算:

計算ab線段與x軸的夾角.

計算cd線段與y軸的夾角.

合併兩個夾角,因為求的是最小角度,所以需要對180進行求餘,得到的角度為最後結果.

首先計算出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°求餘即可.

import math

class

point

:"""

2d座標點

"""def__init__

(self, x, y)

: self.x = x

self.y = y

class

line

:def

__init__

(self, point1, point2)

:"""

初始化包含兩個端點

:param point1:

:param point2:

"""self.point1 = point1

self.point2 = point2

defgetangle

(line1, line2)

:"""

計算兩條線段之間的夾角

:param line1:

:param line2:

:return:

"""dx1 = line1.point1.x - line1.point2.x

dy1 = line1.point1.y - line1.point2.y

dx2 = line2.point1.x - line2.point2.x

dy2 = line2.point1.y - line2.point2.y

angle1 = 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- insideangle

insideangle = insideangle %

180return insideangle

if __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°

計算直線交點與夾角方法

基於matlab求解初等幾何問題 lyqmath 在工程應用 科學計算等領域,計算兩條直線的交點是乙個較為基礎的問題。一般的應該考慮到直線方程的寫法和求解交點的方式。這裡給出乙個具體的處理方式,其基本思想是 首先基於給定的節點定義出直線一般方程,然後求解方程組得到直線方程引數,最後根據得到的兩條直線...

python計算空間中兩個向量的夾角

python計算空間中兩個向量的夾角 python計算兩個三維向量的夾角 def angle2 v1,v2 x np.array v1 y np.array v2 分別計算兩個向量的模 module x np.sqrt x.dot x module y np.sqrt y.dot y 計算兩個向量的...

計算幾何 點對直線張開的夾角

include include include include include include using namespace std define pi acos 1.0 struct point a 50 double zj point l,point w 重點,理解方式首先用atan2求到原點...