Как рассчитать объем объекта, хранящегося в файлах STL? - PullRequest
4 голосов
/ 29 июня 2011

У меня есть .stl ( STL - это формат файла, свойственный программному обеспечению для стереолитографии САПР, созданным в 3D Systems ), из которого я должен рассчитать объем. Как мне это сделать? Я использую приведенный ниже расчет, но объем не равен вычисленному другим программным обеспечением

float x1,y1,z1;
float x2,y2,z2;
float x3,y3,z3;

Выше приведены вершины. triangles - это просто структура данных, содержащая объект с вершинами каждого треугольника.

totalVolume += currentVolume = 
(triangles[i].x1*triangles[i].y2*triangles[i].z3 - 
triangles[i].x1*triangles[i].y3*triangles[i].z2 -

triangles[i].x2*triangles[i].y1*triangles[i].z3 + 
triangles[i].x2*triangles[i].y3*triangles[i].z1 + 
triangles[i].x3*triangles[i].y1*triangles[i].z2 - 
triangles[i].x3*triangles[i].y2*triangles[i].z1) / 6;

Вы также включаете вычисления с вектором нормалей?

Ответы [ 2 ]

6 голосов
/ 02 июля 2011

Объем многогранников обсуждается в статье многогранник в Википедии.Любая действительная тесселяция STL должна быть именно многогранником, где каждый фасет является стороной, поэтому обсуждаемая там формула справедлива.

Предполагая, что вершины ориентированы против часовой стрелки (смотря на внешние нормали), выполняется следующее расширение:1005 *

Уравнение 1 - это просто формула расхождения для многогранников.P [i, j] - это j-я вершина (как вектор из начала координат) i-го треугольника.

Уравнение 2 расширяет это, используя тот факт, что перекрестное произведение двух сторон треугольника (aпараллелограмм) - нормальный вектор треугольника с величиной, в два раза превышающей площадь треугольника.

Кстати, именно поэтому треугольник с нормалью не проявляется в вашем выражении, даже если ваша интуиция говорит, что он каким-то образом должен быть там.Это уже в супе!

Уравнение 3 просто расширяет уравнение 2, используя дистрибутивные свойства перекрестного произведения, и тот факт, что векторное пересечение само является нулевым вектором.

Объем, который вы получаетеиз уравнения 3 подписывается согласно ориентации треугольников.Я привел свою формулировку в соответствие с вашим кодом, но у вас может быть отрицательный результат.Если это так, просто возьмите абсолютное значение.

Теперь, записав слагаемое в вашей записи (за исключением того, что я не потрудился вставить повторяющийся треугольник [i]), я получаю:

(-x3 y2 z1 + x2 y3 z1 + x3 y1 z2 - x1 y3 z2 - x2 y1 z3 + x1 y2 z3)/6.;

Это в точности соответствует тому, что вы написали (кроме заказа)!

Таким образом, есть несколько возможностей:

(1) Возможно, ваш файл STL содержит ошибки и треугольники не отображаются.все ориентированы последовательно.Вы можете проверить это, убедившись, что каждое ребро используется треугольником один раз в прямом направлении и один раз в противоположном направлении.Под «ребром» я подразумеваю пару вершин (p [r], p [s]), которые являются частью одного и того же треугольника.Я изменяю нотацию и использую нижний индекс, чтобы указать уникально индексированную вершину в файле, а не индекс вершины относительно грани, как я делал с двухиндексной нотацией выше).

Если треугольникимеет ребро (p [r], p [s]) в своем списке ориентированных ребер , тогда некоторый другой треугольник должен иметь (p [s], p [r]) (те же вершины, обратный порядок)в списке ориентированных ребер.

(2) Тесселяция не закрыта.Это тот же тест, что и 1, за исключением того, что он открыт, если только один треугольник использует ребро, независимо от ориентации.

(3) Смеете ли вы упомянуть?Вы уверены, что инициализировали currentVolume ?

(4) Вы получаете правильный ответ, но громкость отрицательная, и вы обманываетесь, думая, что метод неправильный.Смотрите мои комментарии выше.

1 голос
/ 29 сентября 2011

int против двойной проблемы?

/ 6; может быть должно быть / 6,0;

...