2013-06-16 6 views
3

Я пытаюсь выяснить, как лучше всего вычислить объем 3D-многогранника с Python, и я надеюсь, что есть простое решение, которое я, похоже, не могу найти.Рассчитать объем 3D-многогранника с Python?

Пример многогранник Example Polyhedron

Я нашел this post, описывающее вычисления площади плоского многоугольника в 3D-пространстве, но это не похоже, чтобы помочь.

+2

Вы можете найти [это] (https://web.archive.org/web/20090312012019/http:/ /www.niksula.cs.hut.fi/~hkankaan/Homepages/calcvolume.html) help –

+0

Вам нужен объем любых многогранников, заданных сложным набором трехмерных вершин и граней на их основе? Или вместо этого, как показывает ваша графика, вам нужен только том, который находится между плоскостью 'z = 0' и поверхностью, определяемой' z = f (x, y) '? –

+0

Этого было бы достаточно, но меня, конечно, интересовало бы общее решение. – ryanjdillon

ответ

2

Если у вас есть только выпуклые многогранники вы можете использовать Qhull связывания scipy.spatial.ConvexHull.

import numpy as np 
    from scipy.spatial import Convexhull 

    points = np.array([[....]]) # your points 
    volume = Convexhull(points).volume 

Дополнительно модуль Делон может триангуляции своих передаваемые точек в тетраэдры для других вещей ..

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. 
+0

То, что я надеялся использовать для этого, - рассчитать объем водного бассейна (например, залива), где у меня есть куча намеченных глубин. В этом случае я не понимаю, почему я не мог выбрать какую-то произвольную точку в центре бассейна на глубине, чтобы сделать это, правильно? Я обернулся некоторыми вещами, но попробую это, как только смогу. Благодаря! – ryanjdillon