Преобразование многоугольника - держите внутренние вершины внутри

У меня есть 2d дискретный многоугольник, состоящий из взаимосвязанных треугольников. В этом многоугольнике можно выделить два типа вершин: граничные вершины, ограничивающие границу многоугольника, и внутренние вершины. Я хотел бы преобразовать этот многоугольник и его содержимое так, чтобы его граница совпадала с другой. На анимации ниже вы можете увидеть иллюстрацию того, чего я хотел бы добиться: полигон начинается с красной границы, и я хотел бы так или иначе «морфировать» его, чтобы он имел зеленую границу.

У меня проблема в том, что, хотя я знаю начальную и конечную координаты для каждой граничной вершины, у меня нет такой информации для «внутренних» вершин. Таким образом, я хотел бы найти способ также преобразовать эти вершины таким образом, чтобы они по-прежнему правильно вписывались в новые границы: каждая внутренняя вершина должна оставаться внутри формы после преобразования. Начальная граница может быть выпуклой, но целевая граница может быть выпуклой или вогнутой.

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

Я пытался самостоятельно искать такие методы, но немного боролся. Я нашел некоторые результаты исследований о том, как достичь подобных целей, а также результаты других пользователей в другом программном обеспечении. Однако большинство результатов исследований, которые я нашел, похоже, были сосредоточены на обеспечении того, чтобы промежуточные шаги морфинга обладали определенными свойствами и, насколько я понимаю, обладали начальными и конечными координатами для каждой вершины. Я немного запутался сейчас и не знаю, куда идти дальше. Любые указатели или предложения по чтению были бы замечательными, и уже существующая реализация Python была бы потрясающей!

То, что хорошо, будет зависеть от того, куда должны пойти точки. Только при условии "Все еще внутри" допустимы очень искаженные результаты.

fana 18.04.2023 06:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
77
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Для (довольно) простого решения я бы сделал триангуляцию многоугольника внешнего контура.

Затем назначьте каждую внутреннюю точку соответствующему треугольнику и вычислите локальные координаты в этом треугольнике (как коэффициенты линейных комбинаций двух сторон треугольника, такие как P=A+t*AB+u*AC или барицентрические координаты или что-то еще.

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

Пример: многоугольник ABCDE, точка F принадлежит треугольнику ADE с координатами t,u, такими как D+0.4*DA+0.4*DE

Ответ принят как подходящий

В итоге я использовал алгоритм, предложенный в статье «Биективные составные сопоставления средних значений» (Schneider et al., 2013). Их метод позволяет создавать биективные барицентрические отображения, что означает отсутствие перекрытия в окончательной форме. Реализация, которую я использовал, приведена в привязках Python библиотеки igl, см. https://libigl.github.io/libigl-python-bindings/igl_docs/#bijective_composite_harmonic_mapping

у вас есть пример реализации этого. Пытаюсь понять граничные условия.

JamesLeversha 04.05.2023 09:54

Действительно ли это отличается от моего ответа (при условии, что библиотека предназначена для триангулированных многоугольников)?

MBo 05.05.2023 07:39

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

TheFamousRat 05.05.2023 08:53

Но обобщенные барицентрические координаты для треугольников такие же, как и обычные барицентрические координаты. Или вы использовали подразделение для выпуклых многоугольников?

MBo 05.05.2023 08:59

Другие вопросы по теме