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

часто желательно изменить поведение существующих кодовых баз путем обертывания или замены функций. Когда редактирование исходного кода тех функций является жизнеспособным вариантом, это может быть простым процессом. Когда источник функций не может быть отредактирован (например, если функции обеспечиваются системной библиотекой C), то альтернативные методы требуются. Здесь, мы представляем такие методы для UNIX, Windows и платформ OS X Macintosh.

Это - большое покрытие PDF, как это было сделано на OS X, Linux и Windows.

Это не имеет никаких удивительных приемов, которые не были зарегистрированы здесь (это - удивительный набор ответов BTW)..., но это - хорошее чтение.

Прерывающие произвольные функции в Windows, UNIX и платформах OS X Macintosh (2004), Daniel S. Myers и Adam L. Bazinet .

Вы можете загружать PDF непосредственно с альтернативного местоположения (для дублирования) .

И наконец, должен, предыдущие два источника так или иначе понизиться в провокационных сообщениях, вот результат поиска Google для него .

48
задан user1118321 5 March 2015 в 14:26
поделиться

2 ответа

The GNU Triangulated Surface Library can do this for you. Keep in mind that the surface must be closed. That is not going to be the case for quite a few 3D models.

If you want to implement it yourself, you could start by taking a look at their code.

4
ответ дан 26 November 2019 в 18:38
поделиться

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

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

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

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());
}
85
ответ дан 26 November 2019 в 18:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: