Как рассчитать объем 3D-сетчатого объекта, поверхность которого состоит из треугольников

Я хочу рассчитать объем 3D-сетчатого объекта с треугольными поверхностями.

    Читая эту статью , на самом деле это довольно простой расчет.

    Хитрость заключается в том, чтобы вычислить подписанный объем тетраэдра – на основе вашего треугольника и завершен в начале координат. Знак объема исходит из того, указывает ли ваш треугольник в направлении начала координат. (Нормаль треугольника сама зависит от порядка ваших вершин, поэтому вы не видите, что это явно указано ниже).

    Все это сводится к следующей простой функции:

    public float SignedVolumeOfTriangle(Vector p1, Vector p2, Vector p3) { var v321 = p3.X*p2.Y*p1.Z; var v231 = p2.X*p3.Y*p1.Z; var v312 = p3.X*p1.Y*p2.Z; var v132 = p1.X*p3.Y*p2.Z; var v213 = p2.X*p1.Y*p3.Z; var v123 = p1.X*p2.Y*p3.Z; return (1.0f/6.0f)*(-v321 + v231 + v312 - v132 - v213 + v123); } 

    а затем драйвер для расчета объема сетки:

     public float VolumeOfMesh(Mesh mesh) { var vols = from t in mesh.Triangles select SignedVolumeOfTriangle(t.P1, t.P2, t.P3); return Math.Abs(vols.Sum()); } 

    Ответ Yip Frank Kruegers хорошо работает +1 для этого. Если у вас есть векторные функции, доступные для вас, вы также можете использовать это:

      public static float SignedVolumeOfTriangle(Vector p1, Vector p2, Vector p3) { return p1.Dot(p2.Cross(p3)) / 6.0f; } 

    редактирование .. добавил impl. для Dot () и Cross (), если вы не уверены. Большинство Math libs будут иметь их. Если вы используете WPF, они реализуются как статические методы classа Vector3D.

      public class Vector { ... public float Dot(Vector a) { return this.X * aX + this.Y * aY + this.Z * aZ; } public Vector Cross(Vector a) { return new Vector( this.Y * aZ - this.Z * aY, this.Z * aX - this.X * aZ, this.X * aY - this.Y * aX ); } ... } 

    Библиотека Trianulated Surface Library GNU может сделать это за вас . Имейте в виду, что поверхность должна быть закрыта. Это не относится к довольно многим 3D-моделям.

    Если вы хотите реализовать его самостоятельно, вы можете начать с изучения их кода.

    Вышеуказанный метод верен для «простых» объектов (без пересекающихся / перекрывающихся треугольников), таких как сферы тетраэдров и т. Д. Для более сложных форм хорошей идеей может быть сегмент сетки (закройте ее) и вычислить объем каждого сегмента отдельно. Надеюсь это поможет.

    Если вы правильно поняли, вы говорите, что у вас уже есть поверхностная grid треугольников, и вы хотите создать из нее сплошную сплошную сетку.

    Треугольники означают, что вам придется использовать тетраэдрические элементы для 3D-интерьера. Вы хотите найти алгоритм автоматической привязки octree, который может воспринимать поверхностную сетку как семя.

    Это обычная проблема в литературе конечного элемента автосоединения. Я бы посмотрел.

    Давайте будем гением компьютера.