У меня есть 2d дискретный многоугольник, состоящий из взаимосвязанных треугольников. В этом многоугольнике можно выделить два типа вершин: граничные вершины, ограничивающие границу многоугольника, и внутренние вершины. Я хотел бы преобразовать этот многоугольник и его содержимое так, чтобы его граница совпадала с другой. На анимации ниже вы можете увидеть иллюстрацию того, чего я хотел бы добиться: полигон начинается с красной границы, и я хотел бы так или иначе «морфировать» его, чтобы он имел зеленую границу.
У меня проблема в том, что, хотя я знаю начальную и конечную координаты для каждой граничной вершины, у меня нет такой информации для «внутренних» вершин. Таким образом, я хотел бы найти способ также преобразовать эти вершины таким образом, чтобы они по-прежнему правильно вписывались в новые границы: каждая внутренняя вершина должна оставаться внутри формы после преобразования. Начальная граница может быть выпуклой, но целевая граница может быть выпуклой или вогнутой.
Важное замечание: я не ищу способ получить промежуточные шаги этого морфинга с определенными свойствами. Я просто хотел бы получить конечную форму с новой границей и триангулированным содержимым, преобразованным, чтобы соответствовать «внутри» формы.
Я пытался самостоятельно искать такие методы, но немного боролся. Я нашел некоторые результаты исследований о том, как достичь подобных целей, а также результаты других пользователей в другом программном обеспечении. Однако большинство результатов исследований, которые я нашел, похоже, были сосредоточены на обеспечении того, чтобы промежуточные шаги морфинга обладали определенными свойствами и, насколько я понимаю, обладали начальными и конечными координатами для каждой вершины. Я немного запутался сейчас и не знаю, куда идти дальше. Любые указатели или предложения по чтению были бы замечательными, и уже существующая реализация Python была бы потрясающей!
Для (довольно) простого решения я бы сделал триангуляцию многоугольника внешнего контура.
Затем назначьте каждую внутреннюю точку соответствующему треугольнику и вычислите локальные координаты в этом треугольнике (как коэффициенты линейных комбинаций двух сторон треугольника, такие как 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
у вас есть пример реализации этого. Пытаюсь понять граничные условия.
Действительно ли это отличается от моего ответа (при условии, что библиотека предназначена для триангулированных многоугольников)?
@MBo нет, в основном это та же идея, за исключением того, что в статье используются обобщенные барицентрические координаты, которые в моих тестах оказались более устойчивыми к экстремальным изменениям границ.
Но обобщенные барицентрические координаты для треугольников такие же, как и обычные барицентрические координаты. Или вы использовали подразделение для выпуклых многоугольников?
То, что хорошо, будет зависеть от того, куда должны пойти точки. Только при условии "Все еще внутри" допустимы очень искаженные результаты.