任意兩平面求夾角 Python練習系列 11

2022-09-18 17:30:11 字數 2970 閱讀 9640

完整**和注釋如下

import math#引入math模組 計算角度用

class point(object):#定義空間點類

"""docstring for point"""

def __init__(self,x,y,z,name):

self.x = x

self.y = y

self.z = z

self.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:#對於每個點

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]#向量ab

ac=[c.x-a.x,c.y-a.y,c.z-a.z]#向量ac

b1,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-degree

return 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求兩個向量的夾角

import numpy as np x np.array 3,5 y np.array 4,2 兩個向量 lx np.sqrt x.dot x ly np.sqrt y.dot y 相當於勾股定理,求得斜線的長度 cos angle x.dot y lx ly 求得cos sita的值再反過來計算...

python 求兩個向量的順時針夾角

以上述舉例,要求 ob vec ob相對 oa vec oa的順時針夾角。注意 這裡使用影象座標系 1 定義求順時針角度的函式 import numpy as np defclockwise angle v1,v2 x1,y1 v1 x2,y2 v2 dot x1 x2 y1 y2 det x1 y...

C 求任意兩整數之和

2019.9.11 作業要求 求出任意兩整數之和 解決方案 1 using system 2using system.collections.generic 3using system.linq 4using system.text 5using system.threading.tasks 67 ...