InesskaПредставьте, что внутри Вашей объёмной фигуры находится некоторая точка
. Выберем один треугольничек сетки (назовём его
). Вместе с точкой
он образует тетраэдр
. Несложно вычислить объем тетраэдра, зная координаты точек
:
Если точка
внутри фигуры является началом координат, и координаты всех точек поверхности вычислены относительно неё (этого всегда несложно добиться, надеюсь, что понятно как), то объём тетраэдра найти ещё проще:
А объём всей фигуры будет равен сумме объёмов тетраэдров, соответствующих всем треугольникам сетки.
Я, конечно, предполагаю, что у Вас есть список всех треугольников сетки -- какой треугольник из каких точек составлен.
Но есть одна тонкость. Боюсь, нижеследующий текст будет сходу непросто воспринять. Точки
-- это вершины некоторого треугольника сетки. Но мы не можем просто взять вершины и назвать любую из них
, другую
, третью
. Мы должны всегда, давая им имена, обходить треугольник в определенном направлении. Мы должны дать имена вершинам так, чтобы глядя на треугольничек с внешней стороны, мы видели, что замкнутый путь
совершается
против часовой стрелки. И только тогда имеем право пользоваться приведенной формулой. Иначе надо как-то переназначить буквы (поменять местами обозначения двух вершин, например
и
).
Если это правило соблюдать, можно правильно вычислять объемы достаточно сложных фигур, не обязательно выпуклых. В некоторых ситуациях объем каких-то тетраэдров может по приведенной формуле получиться отрицательным, и это нормально. Так будет тогда, когда поверхность в некоторых местах изогнулась таким образом, что внешняя нормаль смотрит
на точку
, хотя обычно должна смотреть
от неё -- такое может быть при сложных формах. Если нужно, приведу поясняющий рисунок.
Второй подход более простой, но менее общий.
Если фигура не слишком сложная, и можно выбрать точку
так, что
фигура будет звёздной относительно
, тогда проще просто брать модуль от объёма каждого тетраэдра, то есть игнорировать знак. Но при таком подходе объём змеи
Вы уже не вычислите.