Ваш полигон такой, что вы можете найти точку внутри, чтобы вы могли соединить каждую вершину с точкой без пересечения лица? Если это так, вы можете разделить каждое лицо на треугольники. Вы можете сделать это легко, позволяя одной вершине лица быть точкой поворота и рисовать линии из других вершин в сводную вершину. Например, пятиугольник делится на три треугольника, которые вентилятора из общей вершины. Каждый треугольник образует тетраэдр (трехгранную пирамиду) с внутренней точкой. Затем вы можете объединить объемы всех тетраэдров для каждого лица. Для выпуклого многогранника, окружающего начало координат (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.
Вы можете найти [это] (https://web.archive.org/web/20090312012019/http:/ /www.niksula.cs.hut.fi/~hkankaan/Homepages/calcvolume.html) help –
Вам нужен объем любых многогранников, заданных сложным набором трехмерных вершин и граней на их основе? Или вместо этого, как показывает ваша графика, вам нужен только том, который находится между плоскостью 'z = 0' и поверхностью, определяемой' z = f (x, y) '? –
Этого было бы достаточно, но меня, конечно, интересовало бы общее решение. – ryanjdillon