Как произвольно исказить текстурированный полигон?

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

Есть ли алгоритмы для этого?


person Archagon    schedule 19.02.2010    source источник
comment
Это для приложения реального времени или подходят и более медленные методы? Любое ограничение на количество точек в вашем многоугольнике? Гарантированно ли он выпуклый?   -  person tfinniga    schedule 19.02.2010
comment
Более медленные техники хороши. Нет ограничений на количество баллов, хотя оно не будет смехотворно большим. Вогнутые многоугольники разрешены и ожидаемы.   -  person Archagon    schedule 19.02.2010
comment
Кроме того, это не обязательно должна быть настоящая текстура. Это может быть просто несколько соединенных точек внутри многоугольника, хотя общая идея та же.   -  person Archagon    schedule 19.02.2010


Ответы (3)


Похоже, вам может понадобиться вариант сопоставления Шварца-Кристоффеля. Это тип конформного отображения, которое можно использовать для деформации многоугольника в более простую область, например диск, и обратно; хотя я не реализовал его, по-видимому, он поддается вычислительной обработке.

Для вашего приложения вы должны установить карту исходного полигона в более простую область и вычислить обратную карту для модифицированного полигона; объединение этих двух должно дать вам хорошее конформное отображение исходного полигона в модифицированный.

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

person comingstorm    schedule 20.02.2010

Люди работали над решением этой проблемы в течение последних десяти или двух лет, и уровень техники становится все лучше и лучше (но математика также становится все сложнее). Хорошим местом для начала (и тем, где я остановился) является работа http://www.cs.technion.ac.il/~weber/Publications/Complex-Coordinates/

Прочтите статью там и найдите документы в справочниках. Один из них должен дать вам алгоритм, который вы готовы реализовать.

person brainjam    schedule 05.04.2010

Самый простой метод, который я могу придумать, — это триангулировать входной полигон (используя метод обрезки ушей или что-то подобное), а затем перемещать точки. Затем вы можете использовать барицентрическое отображение из исходного полигона в новое пространство.

Если вы ищете что-то более надежное, вы можете взглянуть на координаты среднего значения.

person tfinniga    schedule 19.02.2010