我试图找出用 Python 计算 3D 多面体体积的最佳方法,我希望那里有一个简单的解决方案,我似乎找不到。
示例多面体
我确实发现这篇文章描述了在 3D 空间中计算平面多边形的面积,但这似乎没有帮助。
如果你只有凸多面体,你可以使用 scipy.spatial.ConvexHull 的 QHull 绑定。
import numpy as np
from scipy.spatial import ConvexHull
points = np.array([[....]]) # your points
volume = ConvexHull(points).volume
此外,使用 Delaunay 模块,您可以将通过的点三角剖分为四面体以获取其他内容。
您的多边形是否可以在内部找到一个点,以便您可以将每个顶点连接到该点而无需穿过面?如果是这样,您可以将每个面细分为三角形。您可以通过将面的一个顶点作为枢轴点并从其他顶点绘制线到枢轴顶点来轻松完成此操作。例如,一个五边形被分成三个三角形,这些三角形从一个共同的顶点形成扇形。每个三角形将形成一个四面体(一个 3 面金字塔),其中的点。然后,您可以将每个面的所有四面体的体积相加。以下是围绕原点 (x=0,y=0,z=0) 的凸多面体。它假设有一个面列表 f,每个面都有一个顶点列表 v。
def volume(self):
''' calculate volume of polyhedron '''
vol = 0.
for f in self.f: # the faces
n = len(f.v)
v2 = f.v[0] # the pivot of the fan
x2 = v2.x
y2 = v2.y
z2 = v2.z
for i in range(1,n-1): # divide into triangular fan segments
v0 = f.v[i]
x0 = v0.x
y0 = v0.y
z0 = v0.z
v1 = f.v[i+1]
x1 = v1.x
y1 = v1.y
z1 = v1.z
# Add volume of tetrahedron formed by triangle and origin
vol += math.fabs(x0 * y1 * z2 + x1 * y2 * z0 \
+ x2 * y0 * z1 - x0 * y2 * z1 \
- x1 * y0 * z2 - x2 * y1 * z0)
return vol/6.