如上圖所示,要求圖中線段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求到原點...