Manifold Geometry // Многообразная Геометрия

Архивы

К эйлеровым операторам: стягивание ребра

Эйлеров оператор дает корректную топологическую структуру модели, но не «подтягивает» геометрию. Следующий этап состоит в том, чтобы реконструировать форму объекта. Рассмотрим типичный топологический случай, показанный на рисунке ниже.

Топологический случай как локальная топологическая обстановка вокруг ребра e.

Расшифруем эту иллюстрацию. Ребро e, подлежащее реконструкции, принадлежит двум граням: f1 и f2. В силу того, что ядро OpenCascade не различает ребра и их вхождения (в отличие от, например, ACIS и Parasolid), ребро e является изначально ориентированным. Эта ориентация позволяет выделить на ребре его стартовую и конечную вершины (vfirst и vlast). Та грань, которая включает ребро e с его заданной ориентацией, объявляется гранью f1. Смежная грань (f2) должна включать ребро e с противоположной ориентацией. Ребра смежных граней также нумеруются определенным образом.

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

Корректная топология модели имеет мало отношения к визуальной форме объекта. Топологический случай, описанный выше, может выглядеть на экране, например, так:

Топологическая корректность не означает геометрической точности. «Синтаксис» модели в порядке, но форма требует доработки.

Такая модель, конечно, никуда не годится. Ее можно привести в порядок, осуществив геометрическую операцию уже БЕЗ изменения топологии. Однако сама по себе геометрическая операция вынуждена оперировать геометрическими (читай «недостоверными») данными. Так, для вычисления новой параметрической кривой ребра следует заново пересечь несущие поверхности граней f1 и f2. Незначительные дефекты этих поверхностей, скажем, паразитные осцилляции или нерегулярная параметризация, могут сказаться на качестве получаемой кривой пересечения. Похожим образом дело обстоит и с вычислением вершин. Для получения новой вершины можно искать минимальное расстояние между опорными кривыми соседних ребер, либо пересекать новую кривую-носитель ребра e с «боковыми» поверхностями (назовем их ffirst и flast). Какой способ выбрать? Очевидно, имея в виду недостоверность геометрических данных, следует выбирать тот способ, который работает на наиболее достоверной геометрии. Этот выбор, в свою очередь, зависит от задачи. Скажем, операция удаления скругления, основанная на эйлеровых операторах, не затрагивает поверхности опорных граней, но меняет окрестные ребра вершины, подлежащей вычислению заново.

Алгоритм стягивания геометрии на ребре можно описать вкратце следующим образом:

  1. Формируем топологический случай, то есть инициализируем переменные f1, f2 и т.д.

  2. Выполняем предварительные расчеты при помощи методов вычислительной геометрии. Здесь работает золотое правило: «do not ask the same geometric question more than once».

  3. «Отвечаем» на геометрические «вопросы», которые «задает» инструмент BRepTools_Modifier библиотеки OpenCascade.
Ответы на «вопросы» в порядке выполнения операций BRepTools_Modifier:

  • NewPoint: пересечение несущих кривых ребра e и кривых его смежных ребер. «Вопрос» задается дважды: для вершин vf и vl.
  • NewCurve: пересечение несущих поверхностей.
  • NewSurface: пусто.
  • NewCurve2d: проекция несущей кривой ребра на поверхность грани.
  • NewParameter: инверсия вершины ребра на его несущую кривую.
  • Continuity: оригинальное значение для ребра.

Пересечение несущих поверхностей — основа реконструкции ребра — должно быть выполнено ровно один раз.

Для вычисления новых вершин можно либо пересекать смежные ребра с кривой icurve, либо искать точку пересечения кривой icurve с гранями ffirst и flast.

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


Изложенный алгоритм стягивания ребра доступен в программе Analysis Situs. Для его запуска из консоли используйте команду "rebuild-edge".