CGAL: Как объединить две (копланарные) грани многогранника с более чем одним общим ребром?

С помощью CGAL, используя любой ядро, но предпочтительно Epeck, как я могу безопасно объединить две копланарные грани (любой степени) Polyhedron_3? Оба фасета находятся на той же поверхности Polyhedron_3 и уже имеют одну или несколько граней. Желаемый результат состоит в том, что все общие ребра удаляются, две грани становятся одной гранью, и после операции не остается ни антенн, ни несвязанных вершин. В качестве примера я хотел бы объединить фасеты F1 и F2, показанные на диаграмме ниже, и удалить края, обозначенные HE1, HE2 и HE3.

пример схемы слияния

Я хочу достичь того же результата, что и

Расчет того, являются ли грани компланарными, не входит в задачу, я могу справиться с этим сам.

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


person crobar    schedule 07.10.2014    source источник


Ответы (1)


Вы можете вызвать функцию join_loop, если ваши грани имеют количество граней.

person sloriot    schedule 07.10.2014
comment
В справке для join_loop указано, что оба фасета и вершины вдоль фасета, обозначенного g, удаляются. Я предположил, что это означает, что после этой операции останется дыра, если они соприкоснутся. Схема также подразумевает, что это для соединения двух несвязанных граней. Не могли бы вы привести небольшой пример его использования в этом контексте? - person crobar; 07.10.2014
comment
Если у вас есть два тетраэдра, у которых одна грань компланарна друг другу, это позволит удалить ее, и тогда многогранник ограничит только один объем. - person sloriot; 08.10.2014
comment
Теперь я прояснил вопрос, я не хочу объединять две грани разных многогранников, я хочу объединить две грани одного и того же многогранника того же, как вы сделали бы с join_facet, за исключением того, что join_facet только полезно для соединения граней, у которых есть только одна общая кромка. Если их больше, join_facet может создать антенны. Конечная цель - объединить все грани триангулированного многогранника, которые компланарны. - person crobar; 08.10.2014
comment
Нет join_facet не работает, даже если у вас n ребер, и он работает только с одним многогранником (в моем примере два тетраэдра находились в одном многограннике) - person sloriot; 08.10.2014
comment
хорошо (думал, что тетраэдр является трехмерной формой, поэтому не видел, как два могут быть частью многогранной поверхности, на самом деле я все еще не совсем понимаю, но это не имеет значения). В любом случае, вы говорите, что join_facet удалит инцидентный фасет и удалит все края, которые ранее были границей между этими фасетами, не оставив антенн? Помощь непонятна по этому поводу. - person crobar; 09.10.2014
comment
Об этом и говорится в документации (в моем ответе есть ссылка) - person sloriot; 09.10.2014
comment
В вашем ответе есть ссылка на join_loop (я думал, мы сейчас говорим о join_facet). Если вы имеете в виду join_loop, в нем указано, что предварительное условие: Фасеты, обозначенные h и g, различны и имеют одинаковую степень (то есть количество ребер)., так что, конечно, это не сработает в моем случае, поскольку две грани могут иметь разное количество ребер (например, соединение треугольника и четырехугольника). Если вы имеете в виду join_facet, в справке не указывается, что происходит с другими общими ребрами, просто противоположный фасет удален (по крайней мере, не в справке, на которую я сейчас ссылаюсь в своем вопросе). - person crobar; 09.10.2014
comment
Извините, я имел в виду join_loop. Затем вам нужно разделить края, чтобы получить идеальное совпадение. - person sloriot; 10.10.2014
comment
Я внимательно просмотрел справку для join_loop и до сих пор не понимаю, как применить ее в моем случае. Какой именно дескриптор полуребра будет передан как h, а какой - как g? Простой пример легко устранит путаницу. - person crobar; 17.10.2014
comment
Ах, теперь я понимаю, что ты хочешь сделать. Это немного сложно сделать. У меня есть код, делающий это в проекте. Проверьте функцию join_faces_with_same_color . - person sloriot; 17.10.2014