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