Предположим, у нас есть многогранник, представляющий объект A , и требуется получить его вогнутости.
Вариант для этого состоит в вычислении выпуклой оболочки CH объекта A и разбиение разности CH - A на подключенные компоненты.
Для этого я попытался использовать модуль Nef Polyhedrons в CGAL .Это позволяет преобразовать A и CH в многогранники Нефа для легкого применения логических операций, таких как разность множеств.
Как только разность получена как многогранник Нефа, еетома, помеченные 1 в поле mark
, должны представлять конечные связные компоненты разности и могут быть преобразованы обратно в многогранники с функцией convert_inner_shell_to_polyhedron
.
Теоретически этот подход должен работать нормально, нона практике существует проблема, которая возникает, когда используемые многогранники являются результатом преобразования файла STEP в треугольную сетку, определяющую многогранник.Фактически, рассмотрим, например, четырехугольное лицо в файле STEP.Во время преобразования он должен быть преобразован как минимум в два треугольника.Проблема заключается в том, что при сохранении сгенерированных треугольников в файл, представляющий преобразованную сетку (например, файл OFF, или STL, или OBJ), они рискуют потерять свою компланарность из-за аппроксимации координат вершин.
Этовызывает, когда вычисляется разность многогранников Нефа, следующие нежелательные поведения:
- генерируются некоторые очень тонкие объемы, потому что одна из диагоналей четырехугольника (предполагается, что четырехугольник был разбит на два треугольника) «сместились» во внутреннюю часть многогранника;
- функция
convert_inner_shell_to_polyhedron
выводит сообщение об ошибке, например lookup_halfedge (): ошибка ввода: фасет 11 разделяет aполжесткость от вершины 2 до вершины 1 с фасетом 0.
Первое поведение не представляет большой проблемы: каждый том, преобразованный в многогранник, может быть проверен на его толщину и в конечном итоге отброшен,Второй, однако, возвращает пустой многогранник, и, насколько я знаю, нет способа получить желаемый объем.
Поэтому я прошу вас о способах решения этой проблемы.Здесь я сообщаю о некоторых наблюдениях, которые я сделал по этому поводу:
- CGAL Многогранники позволяют использовать полигональные грани вместо треугольных, поэтому решением может быть преобразование файла STEP в полигональную сетку: это должно позволитьподдерживать копланарность точек одних и тех же граней.Однако мне не удалось найти программное обеспечение, которое выполняет преобразование без прохождения через треугольную сетку;
- преобразует непосредственно файл STEP в экземпляр многогранника CGAL.Я думаю, что этот подход далек от того, чтобы быть доступным за разумное время:
- , реализующий некоторый метод для исправления копланарности точек соседних граней.Это может быть практически осуществимым методом, но могут быть некоторые другие проблемы, возникающие при изменении вручную положения вершин многогранника.