答案 0 :(得分:2)
如果您只有凸多面体,则可以使用scipy.spatial.ConvexHull的QHull绑定。
import numpy as np
from scipy.spatial import Convexhull
points = np.array([[....]]) # your points
volume = Convexhull(points).volume
此外,模块Delaunay可以将您传递的点三角测量为四面体以用于其他东西..
答案 1 :(得分:1)
您的多边形是否可以在内部找到一个点,以便您可以将每个顶点连接到该点而不会穿过面?如果是这样,您可以将每个面细分为三角形。您可以通过让面的一个顶点成为枢轴点并从其他顶点绘制线到枢轴顶点来轻松完成此操作。例如,五边形被分成三个三角形,从共同的顶点扇形展开。每个三角形将形成一个四面体(一个三面金字塔),内部有一个点。然后,您可以为每个面添加所有四面体的体积。以下是围绕原点的凸多面体(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.