如何用Matplotlib和Numpy计算3D绘图的体积与表面积?
计算该3D模型的体积与表面积
一、模型结构分析
你提供的3D模型顶点坐标如下:
- 底部4个顶点(z=-2.5):
v0(-2,-2,-2.5)、v1(2,-2,-2.5)、v2(2,2,-2.5)、v3(-2,2,-2.5) - 顶部2个顶点(z=2.5):
v4(2,0,2.5)、v5(-2,0,2.5)
模型由5个面组成:2个三角形面、3个四边形面,属于凸多面体,可以通过两种方式计算体积和表面积:手动拆分几何体计算,或者利用Python库自动计算。
二、体积计算
方法1:利用scipy.spatial.ConvexHull自动计算
凸多面体的体积可以直接用ConvexHull快速求解,只需在你的代码中加入以下片段:
from scipy.spatial import ConvexHull # 基于顶点计算凸包 hull = ConvexHull(v) print(f"模型体积:{hull.volume}")
运行后会输出准确的体积结果,这个方法简单高效,适合大多数凸多面体场景。
方法2:手动拆分几何体计算
把模型拆成两个对称区域(y≤0和y≥0)分别计算:
- y≤0区域:由
v0、v1、v4、v5组成的斜四棱柱,底面为x∈[-2,2]、z∈[-2.5,2.5]的矩形(面积4×5=20),y方向垂直距离为2,体积=20×2=40 - y≥0区域:由
v2、v3、v4、v5组成的楔形体,可看作底面为y∈[0,2]、x∈[-2,2]的矩形(面积4×2=8),平均高度为2.5,体积=8×2.5=20
总体积=40+20=60,和ConvexHull计算结果一致。
三、表面积计算
方法1:利用scipy.spatial.ConvexHull自动计算
ConvexHull同样可以直接输出表面积:
print(f"模型表面积:{hull.area}")
方法2:手动计算每个面的面积之和
逐个计算5个面的面积后求和:
- 底部矩形面
v0-v1-v2-v3:面积=4×4=16 - 平行四边形面
v0-v1-v4-v5:边长分别为4和√(2²+5²)=√29,面积=4×√29≈21.54 - 三角形面
v0-v3-v5:用海伦公式计算,面积≈10.72 - 三角形面
v2-v1-v4:与v0-v3-v5对称,面积≈10.72 - 平行四边形面
v2-v3-v5-v4:与v0-v1-v4-v5对称,面积≈21.54
总表面积=16 + 21.54×2 + 10.72×2≈80.52,和ConvexHull计算结果一致。
完整代码示例
将计算逻辑整合到你的原始代码中:
from matplotlib import pyplot as plt from mpl_toolkits.mplot3d.art3d import Poly3DCollection, Line3DCollection import numpy as np from scipy.spatial import ConvexHull fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 模型顶点 v = np.array([[-2, -2, -2.5], [2, -2, -2.5], [2, 2, -2.5], [-2, 2, -2.5], [2,0,2.5], [-2,0,2.5]]) ax.scatter3D(v[:, 0], v[:, 1], v[:, 2]) # 模型面集合 verts = [ [v[0],v[1],v[4],v[5]], [v[0],v[3],v[5]], [v[2],v[1],v[4]], [v[2],v[3],v[5],v[4]], [v[0],v[1],v[2],v[3]]] # 绘制模型 ax.add_collection3d(Poly3DCollection(verts, facecolors='cyan', linewidths=1, edgecolors='r', alpha=.25)) # 计算并输出体积、表面积 hull = ConvexHull(v) print(f"模型体积:{hull.volume}") print(f"模型表面积:{hull.area}") plt.show()
内容的提问来源于stack exchange,提问作者Freya the Goddess
相关产品推荐
相关产品推荐

