任意两平面求夹角|Python练习系列[11]
生活随笔
收集整理的這篇文章主要介紹了
任意两平面求夹角|Python练习系列[11]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
代碼演示視頻
完整代碼和注釋如下
import math#引入math模塊 計算角度用 class point(object):#定義空間點類"""docstring for point"""def __init__(self,x,y,z,name):self.x = xself.y = yself.z = zself.name = name class plane(object):#定義平面類"""docstring for plane"""def __init__(self, A,B,C,name):self.points=[A,B,C]#一個平面三個點self.points_name=[A.name,B.name,C.name]#點的名字self.name = name#平面的名字self.n=[]#平面的法向量def isplane(self):#判斷這三個點是否能構成平面coors=[[],[],[]]#三個點的xyz坐標分別放在同一個列表用來比較for _point in self.points:#對于每個點coors[0].append(_point.x)coors[1].append(_point.y)coors[2].append(_point.z)for coor in coors:if coor[0]==coor[1]==coor[2]:#如果三個點的x或y或z坐標相等 則不能構成平面return print('Points:',*self.points_name,'cannot form a plane')def normal(self):#獲得該平面的法向量self.isplane()#獲得該平面的法向量前提是能構成平面A,B,C=self.points#對應三個點AB=[B.x-A.x,B.y-A.y,B.z-A.z]#向量ABAC=[C.x-A.x,C.y-A.y,C.z-A.z]#向量ACB1,B2,B3=AB#向量AB的xyz坐標C1,C2,C3=AC#向量AC的xyz坐標self.n=[B2*C3-C2*B3,B3*C1-C3*B1,B1*C2-C1*B2]#已知該平面的兩個向量,求該平面的法向量的叉乘公式def angle(self,P2):#兩個平面的夾角x1,y1,z1=self.n#該平面的法向量的xyz坐標x2,y2,z2=P2.n#另一個平面的法向量的xyz坐標cosθ=((x1*x2)+(y1*y2)+(z1*z2))/(((x1**2+y1**2+z1**2)**0.5)*((x2**2+y2**2+z2**2)**0.5))#平面向量的二面角公式degree=math.degrees(math.acos(cosθ))if degree>90:#二面角∈[0°,180°] 但兩個平面的夾角∈[0°,90°]degree=180-degreereturn print('平面',self.name,P2.name,'的夾角為'+str(round(degree,5))+'°')#round(數值,四舍五入位數) math.degrees(弧度)將弧度轉換為角度 math.acos(數值)返回該數值的反余弦弧度值#測試 print('-'*25) A=point(0,0,1,'A')#六個點 B=point(1,0,1,'B') C=point(1,1,0,'C') P1=plane(A,B,C,'P1')#p1平面 D=point(0,1,1,'D') E=point(1,1,1,'E') F=point(0.5,0,0,'F') P2=plane(D,E,F,'P2')#p2平面 P1.normal()#求平面p1 p2的法向量 P2.normal() P1.angle(P2)#求平面p1 p2的夾角print('-'*25) G=point(2,0,0,'G')#六個點 H=point(0,0,0,'H') I=point(0,3,3**0.5,'I') P3=plane(G,H,I,'P3')#p3平面 J=point(2/3,4/3,0,'J') K=point(0,0,0,'K') L=point(0,3,3**0.5,'L') P4=plane(J,K,L,'P4')#p4平面 P3.normal()#分別求平面p3 p4的法向量 P4.normal() P3.angle(P4)#求平面p3 p4的夾角print('-'*25) M=point(0,1,0,'M')#六個點 N=point(0,0,0,'N') O=point(1,1,1,'O') P5=plane(M,N,O,'P5')#p1平面 Q=point(0,0,2,'Q') R=point(0,0,0,'R') S=point(1,1,1,'S') P6=plane(Q,R,S,'P6')#p2平面 P5.normal()#求平面p1 p2的法向量 P6.normal() P5.angle(P6)#求平面p1 p2的夾角print('-'*25) T=point(12.6,-1,63,'T')#六個點 U=point(0,7,8,'U') V=point(11,9,83.2,'V') P7=plane(T,U,V,'P7')#p1平面 W=point(45,2,13,'W') X=point(9,10,-56,'X') Y=point(0.5,-7,1,'Y') P8=plane(W,X,Y,'P8')#p2平面 P7.normal()#求平面p1 p2的法向量 P8.normal() P7.angle(P8)#求平面p1 p2的夾角總結
以上是生活随笔為你收集整理的任意两平面求夹角|Python练习系列[11]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 行列式运算算法c语言,新手作品:行列式计
- 下一篇: golang计算任意两点间的方位角