Метод для вычисления центра массы от .stl (литография стерео) файл?

Я пытаюсь вычислить центр массы (x, y, z) координаты объекта, определенного в файле STL (литография стерео, не быть перепутанным со стандартной библиотекой шаблонов). Файл STL содержит замкнутый объект (или объекты) определенный границей, сделанной из треугольников. Сами треугольники находятся не обязательно в любом порядке, файл является просто координатами 3 вершины каждого треугольника, плавающего в 3D пространстве плюс вектор нормали к треугольнику (нормальное должно быть игнорировано, поскольку это не всегда делается правильно). Нет ничего, что связывает каждый треугольник друг с другом, предполагается, что объект закрывается.

Один простой подход должен был бы разделить объем (в этом случае, поле) в миллионы элементов и определить, ли каждый элемент в объекте, определенном в файле STL или нет, то подведите итог моментов и вычислите центр массы. Это работало бы, но его совсем не изящный и чрезвычайно медленный.

Другой метод должен был бы преобразовать контурное представление во многие упакованные твердые частицы четырехгранника. Форма, что я мог вычислить центр массы каждого четырехгранника, его объема, и получающийся момент и таким образом вычислить полный центр массы от суммы всех четырехгранников. Проблема с этим состоит в том, что я не знаю, как преобразовать поверхностное представление треугольников в представление объема четырехгранников (я предполагаю, что это - справедливо не тривиальная задача).

Доза кто-либо знает о каких-либо методах или может продумать каких-либо методов, которые я мог попробовать? Или возможно даже какой-либо ссылочный материал, который говорит об этом?

Для получения дополнительной информации о файлах STL (только первые 2 раздела важны, все остальное бесполезно): http://en.wikipedia.org/wiki/STL_%28file_format%29

7
задан sth 18 January 2010 в 04:16
поделиться

2 ответа

После большого мышления и экспериментов у меня есть ответ!

Сначала мы добавляем 4-й пункт на каждый треугольник, чтобы сделать их в тетраэдроны с объемным центром. Мы рассчитаем объемы и центры масс и умножьте их друг с другом, чтобы получить наши моменты. Мы суммируем моменты и разделим общего объема, чтобы получить наш общий центроид.

Мы рассчитываем тома, используя метод определения, показанного здесь (уравнение 32): : http://mathworld.wolfram.com/tetrahedron.html

Центроиды каждого из тетраэдронов просто в среднем 4 точки.

Хитрость вот в том, что из-за того, как создается файл STL, треугольники имеют нормальную точку наружу от поверхности части, после правого правила 3 ​​вершины, используемых для создания треугольника. Мы можем использовать это в наше преимущество, позволив нам иметь последовательную конвенцию, в которой можно определить, следует ли добавить объем тетраэдра или вычтена из нашей чистой части (это потому, что ориентира, которую мы выбрали, не обязательно быть внутри части И общая часть не обязательно выпуклая, однако закрытый объект).

Используя определенный метод для расчета тома, первые три точки координат будут представлять три точки нашего треугольника. Четвертый момент будет нашим общим происхождением. Если нормальный, созданный треугольником (после правила правого рук, идущий от точки 1, 2, 3) указывает на нашу общую ссылочную точку, этот объем будет рассчитан как не часть нашего общего твердого или отрицательного объема (путем указывающего на Я имею в виду вектор, созданный нормальным треугольником, является свободно, направлена ​​на одну и ту же сторону, что и нормальный самолет, созданный вектором из нашей ориентиры на центр тетраэдра). Если вектор указывает от контрольной точки, это затем положительный объем или внутри детали. Если это нормально, то громкость переходит к нулю, так как треугольник находится в той же плоскости, что и контрольная точка.

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

В любом случае, вот код (его еще проще, чем объяснение).

class data // 3 vertices of each triangle
{
public:
    float x1,y1,z1;
    float x2,y2,z2;
    float x3,y3,z3;
};

int main ()
{
    int numTriangles; // pull in the STL file and determine number of triangles
    data * triangles = new triangles [numTriangles];
    // fill the triangles array with the data in the STL file

    double totalVolume = 0, currentVolume;
    double xCenter = 0, yCenter = 0, zCenter = 0;

    for (int i = 0; i < numTriangles; i++)
    {
        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;
        xCenter += ((triangles[i].x1 + triangles[i].x2 + triangles[i].x3) / 4) * currentVolume;
        yCenter += ((triangles[i].y1 + triangles[i].y2 + triangles[i].y3) / 4) * currentVolume;
        zCenter += ((triangles[i].z1 + triangles[i].z2 + triangles[i].z3) / 4) * currentVolume;
    }

    cout << endl << "Total Volume = " << totalVolume << endl;
    cout << endl << "X center = " << xCenter/totalVolume << endl;
    cout << endl << "Y center = " << yCenter/totalVolume << endl;
    cout << endl << "Z center = " << zCenter/totalVolume << endl;
}

Чрезвычайно быстры для расчета центров массы для файлов STL.

12
ответ дан 6 December 2019 в 19:36
поделиться

Отредактируйте: Посмотрите Посмотрите: «Алгоритм намотки намотки» или «Алгоритм пересечения номера» - что я пытаюсь описать ниже, является трехмерным алгоритмом номера пересечения.

У меня есть ощущение, что что-то вроде этого будет работать, но у меня нет возможности проверить ее, прямо сейчас:

построить заполненную 3-D структуру из треугольников в STL файл итеративно. Начните с выбора одного точка для использования в качестве основы для 3-D структуры. Затем начните свою структуру, создавая треугольную пирамиду, с основанием, определяемой первым треугольником в файле STL, и вершина выбранной вами точки. Каждый такой компонент вашего итеративно построенного объема также будет содержать «паритет пересечения» - инициализируйте его до 0.

для каждого последующего треугольника в файле STL, создайте аналогичную пирамиду и посмотреть, пересекается ли он с 3-D структурой что вы построили до сих пор. Если это делает, рассчитайте пересечение и сегменту существующую структуру и новую пирамиду так, чтобы ни один развалился два компонента. Держите «четность пересечения» внешней части нового многогранника 0, но переключите его на всех внутренних частях пересечения - если это было 0, сделайте ее 1, если это было 1, сделайте его 0.

в В конце концов, у вас будет закрытый многогранник, определяемый всеми частями вашей структуры, у которых есть четность пересечения 0. Рассчитайте моменты всех этих многогранников, а в среднем их вместе, чтобы получить ваш центр массы. Я думаю, что сложность будет что-то вроде o (n ^ 2).

1
ответ дан 6 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

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