Как удалить самопересекающиеся треугольники из трехмерной сетки поверхности? - PullRequest
0 голосов
/ 10 октября 2018

У меня есть CGAL surface_mesh из треугольников с некоторыми самопересекающимися треугольниками, которые я пытаюсь удалить, чтобы создать непрерывную оболочку из 2 коллекторов, в конечном счете, для печати. ​​

Я пытался использовать remove_self_intersection () и autorefine_and_remove_self_intersections () из этого ответа .Первое удаляет только несколько самопересечений, а второе полностью удаляет мою сетку.

Итак, я пробую свой собственный подход - я нахожу самопересечения , а затем пытаюсь удалить их.Я попытался использовать низкий уровень remove_face , но границы впоследствии не обнаруживаются, поэтому я не могу заполнить получившиеся отверстия. Этот ответ относится к использованию Euler remove_face более высокого уровня, но этот метод, и make_hole, похоже, полностью отбрасывают мою сетку.

Вот выдержка (я использую break, чтобы посмотреть, смогу ли яудалить хотя бы один треугольник, и я просто пытаюсь с первой парой):

    vector<pair<face_descriptor, face_descriptor> > intersected_tris;
PMP::self_intersections(mesh, back_inserter(intersected_tris));
for (pair<face_descriptor, face_descriptor> &p : intersected_tris) {
    CGAL::Euler::remove_face(mesh.halfedge(get<0>(p)), mesh);
    break;
}

Здесь - пример выходных данных, прежде чем я попытаюсь удалить самопересечения.

1 Ответ

0 голосов
/ 11 октября 2018

Мой подход к удалению самопересекающихся треугольников заключается в агрессивном удалении пересекающихся граней, а также соседних граней и заполнении получающихся отверстий.Благодаря комментарию @sloriot я понял, что функция Euler :: remove_face не сработала из-за повторяющихся граней в наборе, возвращенных как функциями self_intersections, так и expand_face_selection.

Быстрый способ удалить повторяющиеся грани из результата вектора этих двух функций:

std::set<face_descriptor> s(selected_faces.begin(), selected_faces.end());
selected_faces.assign(s.begin(), s.end());

Этот код преобразует вектор граней в набор (множества не содержат дубликатов), а затемснова преобразовывая набор.

Как только дубликаты были удалены, функция Euler :: remove_face работала корректно, включая обновление границ, чтобы можно было использовать функцию triangulate_hole для результата, получая конечную поверхность без собственногопересечения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...