日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

根据空间中不共面的四个点坐标,求构成任意四面体的内外球

發布時間:2023/12/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 根据空间中不共面的四个点坐标,求构成任意四面体的内外球 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

海倫公式:


四面體體積公式

六條邊分別為a,b,c,a1,b1,c1。
a,b,c,a1,b1,c1,其中a與a1,b與b1,c與c1互為對邊,那么有三棱錐(四面體)的體積公式為:
V=1/12sqrt(4a2b2c2-a2D2-b2E2c2F2+DEF),sqrt表示開根號,a2表示平方
D=b2+c2-a12,E=a2+c2-b12, F=a2+b2-c1**2

內切球半徑公式

R = (3*V)/S s為四面體面積

最小外接球

四個點到球心的距離相等
代碼如下:

import math import numpy as np from scipy.linalg import solve def nball(x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4):try:#六條邊分別為a,b,c,a1,b1,c1a = math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2 + (z1 - z2) ** 2)b = math.sqrt((x1 - x3) ** 2 + (y1 - y3) ** 2 + (z1 - z3) ** 2)c = math.sqrt((x1 - x4) ** 2 + (y1 - y4) ** 2 + (z1 - z4) ** 2)a1 = math.sqrt((x3 - x4) ** 2 + (y3 - y4) ** 2 + (z3 - z4) ** 2)#a的對邊b1 = math.sqrt((x2 - x4) ** 2 + (y2 - y4) ** 2 + (z2 - z4) ** 2)#b的對邊c1 = math.sqrt((x2 - x3) ** 2 + (y2 - y3) ** 2 + (z2 - z3) ** 2)#c的對邊print('六條邊長',[a,b,c,a1,b1,c1])#根據海倫公式求四面體各個面的面積,分別為s1,s2,s3,s4#a1b1c1邊構成s1,abc1邊構成s2,bca1邊構成s3,acb1邊構成s4p1 = round((a1 + b1 + c1) / 2, 3) # 海倫公式的p值s1 = round(math.sqrt(p1 * (p1 - a1) * (p1 - b1) * (p1 - c1)), 3) # 面積p2 = round((a + b + c1) / 2, 3)s2 = round(math.sqrt(p2 * (p2 - a) * (p2 - b) * (p2 - c1)), 3)p3 = round((b+c+a1) / 2, 3)s3 = round(math.sqrt(p3 * (p3 - a1) * (p3 - b) * (p3 - c)), 3)p4 = round((a + b1 + c) / 2, 3)s4 = round(math.sqrt(p4 * (p4 - a) * (p4 - b1) * (p4 - c)), 3)S=s1+s2+s3+s4#四面體表面積print('四面體表面積',round(S,3))#a,b,c,a1,b1,c1,其中a與a1,b與b1,c與c1互為對邊,那么有三棱錐(四面體)的體積公式為:#V=1/12sqrt(4a**2b**2c**2-a**2D**2-b**2E**2-c**2F**2+DEF),sqrt表示開根號,a**2表示平方#D=b**2+c**2-a1**2,E=a**2+c**2-b1**2, F=a**2+b**2-c1**2D = b ** 2 + c ** 2 - a1 ** 2E = a ** 2 + c ** 2 - b1 ** 2F = a ** 2 + b ** 2 - c1 ** 2sun=math.sqrt(4*(a ** 2)*(b ** 2)*(c ** 2) - (a ** 2)*(D ** 2) - (b ** 2)*(E ** 2) - (c ** 2)*(F ** 2) + D*E*F)V = (1/12)*sun"""# 用線性代數和等體積法求得四面體的體積A1 = x2 * (y3 * z4 - y4 * z3) - x3 * (y2 * z4 - y4 * z2) + x4 * (y2 * z3 - y3 * z2)A2 = x1 * (y3 * z4 - y4 * z3) - x3 * (y1 * z4 - y4 * z1) + x4 * (y1 * z3 - y3 * z1)A3 = x1 * (y2 * z4 - y4 * z2) - x2 * (y1 * z4 - y4 * z1) + x4 * (y1 * z2 - y2 * z1)A4 = x1 * (y2 * z3 - y3 * z2) - x2 * (y1 * z3 - y3 * z1) + x3 * (y1 * z2 - y2 * z1)v = (A1 - A2 + A3 - A4)/6"""print('四面體體積',round(V,3))# 根據等體積法公式1/3*RS=V,求得內切球的半徑nR = (3*V)/Sprint('內切球半徑',round(nR,3))narea=4*3.14*nR**2#球體的表面積V=(4/3)*3.14*nR**3#球體的體積print('內切球表面積',round(narea,3))print('內切球體積',round(V,3))except:print('輸入的點不能構成四面體') def wball(x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4):#四面體的四個頂點在最小外接球的球面上,因此假設球心為(x,y,z),四個頂點到球心的距離相等,聯立四條方程,化簡為三元一次方程try:#化簡后,形如:-6.0x-8.0y+2.0z=-26.0', '-4.0x-6.0y-10.0z=-38.0', '-12.0x+0.0y-6.0z=-45.0'a=str(2*x1-2*x2)+"x+"+str(2*y1-2*y2)+"y+"+str(2*z1-2*z2)+"z="+str(x1**2-x2**2+y1**2-y2**2+z1**2-z2**2)b = str(2 * x1 - 2 * x3) + 'x+'+str(2 * y1 - 2*y3)+ 'y+'+str(2 * z1 - 2 * z3) + 'z=' + str(x1 ** 2 - x3 ** 2 + y1 ** 2 - y3 ** 2 + z1 ** 2 - z3 ** 2)c = str(2 * x1 - 2 * x4) + 'x+'+str(2 * y1 - 2 * y4) + 'y+'+str(2 * z1 - 2 * z4) + 'z=' + str(x1 ** 2 - x4 ** 2 + y1 ** 2 - y4 ** 2 + z1 ** 2 - z4 ** 2)clist=[a.replace('+-','-'),b.replace('+-','-'),c.replace('+-','-')]print('化簡后的三元一次方程為:')for each in clist:print(each)# 分別輸出三元一次方程的系數矩陣a1 = np.array([[float(2 * x1 - 2 * x2),float(2*y1-2*y2),float(2*z1-2*z2)],#[float(2 * x1 - 2 * x3),float(2 * y1 - 2*y3),float(2 * z1 - 2 * z3)],[float(2 * x1 - 2 * x4),float(2 * y1 - 2 * y4),float(2 * z1 - 2 * z4)]])# 三元一次方程的值b1 = np.array([float(x1**2-x2**2+y1**2-y2**2+z1**2-z2**2),float(x1 ** 2 - x3 ** 2 + y1 ** 2 - y3 ** 2 + z1 ** 2 - z3 ** 2),float(x1 ** 2 - x4 ** 2 + y1 ** 2 - y4 ** 2 + z1 ** 2 - z4 ** 2)])# 計算x = solve(a1, b1)# 打印結果print('外接球心坐標為','('+str(round(x[0],3))+','+str(round(x[1],3))+','+str(round(x[2],3))+')')R=math.sqrt((x1-x[0])**2+(y1-x[1])**2+(z1-x[2])**2)#根據空間中兩點坐標公式求出球體半徑print('外接球半徑',round(R,3))#保留三位小數area=4*3.14*R**2#球體的表面積print('外接球表面積',round(area,4))V=(3/4)*3.14*R**3#球體的體積print('外接球體積',round(V,4))except:print('輸入的點不能構成四面體')def main():x1 = float(input('輸入第一個點的x值:'))y1 = float(input('輸入第一個點的y值:'))z1 = float(input('輸入第一個點的z值:'))x2 = float(input('輸入第二個點的x值:'))y2 = float(input('輸入第二個點的y值:'))z2 = float(input('輸入第二個點的z值:'))x3 = float(input('輸入第三個點的x值:'))y3 = float(input('輸入第三個點的y值:'))z3 = float(input('輸入第三個點的z值:'))x4 = float(input('輸入第四個點的x值:'))y4 = float(input('輸入第四個點的y值:'))z4 = float(input('輸入第四個點的z值:'))nball(x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4)print('+'*14)wball(x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4)if __name__=="__main__":main()

運行結果
以(6,0,3),(2,3,5),(3,4,-1),(0,0,0)四個點為測試用例.。

結果如下:
輸入第一個點的x值:0
輸入第一個點的y值:0
輸入第一個點的z值:0
輸入第二個點的x值:3
輸入第二個點的y值:4
輸入第二個點的z值:-1
輸入第三個點的x值:2
輸入第三個點的y值:3
輸入第三個點的z值:5
輸入第四個點的x值:6
輸入第四個點的y值:0
輸入第四個點的z值:3
六條邊長 [5.0990195135927845, 6.164414002968976, 6.708203932499369, 5.385164807134504, 6.4031242374328485, 6.164414002968976]
四面體表面積 60.609
四面體體積 23.5
內切球半徑 1.163
內切球表面積 16.994
內切球體積 6.589
++++++++++++++
化簡后的三元一次方程為:
-6.0x-8.0y+2.0z=-26.0
-4.0x-6.0y-10.0z=-38.0
-12.0x+0.0y-6.0z=-45.0
外接球心坐標為 (2.883,1.521,1.734)
外接球半徑 3.692
外接球表面積 171.2274
外接球體積 118.5404

總結

以上是生活随笔為你收集整理的根据空间中不共面的四个点坐标,求构成任意四面体的内外球的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。