1 import math#引入math模块 计算角度用 2 class point(object):#定义空间点类 3 """docstring for point""" 4 def __init__(self,x,y,z,name): 5 self.x = x 6 self.y = y 7 self.z = z 8 self.name = name 9 class plane(object):#定义平面类 10 """docstring for plane""" 11 def __init__(self, A,B,C,name): 12 self.points=[A,B,C]#一个平面三个点 13 self.points_name=[A.name,B.name,C.name]#点的名字 14 self.name = name#平面的名字 15 self.n=[]#平面的法向量 16 def isplane(self):#判断这三个点是否能构成平面 17 coors=[[],[],[]]#三个点的xyz坐标分别放在同一个列表用来比较 18 for _point in self.points:#对于每个点 19 coors[0].append(_point.x) 20 coors[1].append(_point.y) 21 coors[2].append(_point.z) 22 for coor in coors: 23 if coor[0]==coor[1]==coor[2]:#如果三个点的x或y或z坐标相等 则不能构成平面 24 return print('Points:',*self.points_name,'cannot form a plane') 25 def normal(self):#获得该平面的法向量 26 self.isplane()#获得该平面的法向量前提是能构成平面 27 A,B,C=self.points#对应三个点 28 AB=[B.x-A.x,B.y-A.y,B.z-A.z]#向量AB 29 AC=[C.x-A.x,C.y-A.y,C.z-A.z]#向量AC 30 B1,B2,B3=AB#向量AB的xyz坐标 31 C1,C2,C3=AC#向量AC的xyz坐标 32 self.n=[B2*C3-C2*B3,B3*C1-C3*B1,B1*C2-C1*B2]#已知该平面的两个向量,求该平面的法向量的叉乘公式 33 def angle(self,P2):#两个平面的夹角 34 x1,y1,z1=self.n#该平面的法向量的xyz坐标 35 x2,y2,z2=P2.n#另一个平面的法向量的xyz坐标 36 cosθ=((x1*x2)+(y1*y2)+(z1*z2))/(((x1**2+y1**2+z1**2)**0.5)*((x2**2+y2**2+z2**2)**0.5))#平面向量的二面角公式 37 degree=math.degrees(math.acos(cosθ)) 38 if degree>90:#二面角∈[0°,180°] 但两个平面的夹角∈[0°,90°] 39 degree=180-degree 40 return print('平面',self.name,P2.name,'的夹角为'+str(round(degree,5))+'°') 41 #round(数值,四舍五入位数) math.degrees(弧度)将弧度转换为角度 math.acos(数值)返回该数值的反余弦弧度值 42 43 #测试 44 print('-'*25) 45 A=point(0,0,1,'A')#六个点 46 B=point(1,0,1,'B') 47 C=point(1,1,0,'C') 48 P1=plane(A,B,C,'P1')#p1平面 49 D=point(0,1,1,'D') 50 E=point(1,1,1,'E') 51 F=point(0.5,0,0,'F') 52 P2=plane(D,E,F,'P2')#p2平面 53 P1.normal()#求平面p1 p2的法向量 54 P2.normal() 55 P1.angle(P2)#求平面p1 p2的夹角 56 57 print('-'*25) 58 G=point(2,0,0,'G')#六个点 59 H=point(0,0,0,'H') 60 I=point(0,3,3**0.5,'I') 61 P3=plane(G,H,I,'P3')#p3平面 62 J=point(2/3,4/3,0,'J') 63 K=point(0,0,0,'K') 64 L=point(0,3,3**0.5,'L') 65 P4=plane(J,K,L,'P4')#p4平面 66 P3.normal()#分别求平面p3 p4的法向量 67 P4.normal() 68 P3.angle(P4)#求平面p3 p4的夹角 69 70 print('-'*25) 71 M=point(0,1,0,'M')#六个点 72 N=point(0,0,0,'N') 73 O=point(1,1,1,'O') 74 P5=plane(M,N,O,'P5')#p1平面 75 Q=point(0,0,2,'Q') 76 R=point(0,0,0,'R') 77 S=point(1,1,1,'S') 78 P6=plane(Q,R,S,'P6')#p2平面 79 P5.normal()#求平面p1 p2的法向量 80 P6.normal() 81 P5.angle(P6)#求平面p1 p2的夹角 82 83 print('-'*25) 84 T=point(12.6,-1,63,'T')#六个点 85 U=point(0,7,8,'U') 86 V=point(11,9,83.2,'V') 87 P7=plane(T,U,V,'P7')#p1平面 88 W=point(45,2,13,'W') 89 X=point(9,10,-56,'X') 90 Y=point(0.5,-7,1,'Y') 91 P8=plane(W,X,Y,'P8')#p2平面 92 P7.normal()#求平面p1 p2的法向量 93 P8.normal() 94 P7.angle(P8)#求平面p1 p2的夹角