Плавные переходы между двумя пересекающимися полигонами (интересная задача)

У меня есть интересная проблема, которую я пытался решить некоторое время. Здесь нет «правильного» решения, как нет и строгих критериев успеха. Чего я хочу добиться, так это плавного перехода между двумя простыми многоугольниками, от многоугольника A к многоугольнику B. Многоугольник A полностью содержится внутри многоугольника B.

Мои критерии для этого перехода:

  1. Переход непрерывен во времени и пространстве
  2. Область, которая «заливается» из многоугольника A в многоугольник B, должна быть заполнена, как если бы в A была жидкость, которая выливалась в форму B.
  3. Важно, что эта анимация может быть рассчитана либо на лету, либо задана набором параметров, которые занимают мало места, скажем, менее нескольких Кб.

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

Решения, которые я рассмотрел и в основном исключил:

  • Соединяем вершины в A и B и просто интерполируем. Не будет хорошо выглядеть и не работает в случае вогнутых полигонов.
  • Разделение области B-A на выпуклые многоугольники, возможно, диаграмму Вороного, и вычисление дискретных состояний многоугольника путем выполнения BFS на меньших выпуклых многоугольниках. Затем я интерполирую между дискретными состояниями. Примечание. Если многоугольник B-A выпуклый, переход довольно тривиален. Я не стал использовать это решение, потому что разделить B-A на маленькие выпуклые многоугольники одинакового размера было на удивление сложно.
  • Моделирование: Разделите полигон А. Переместите каждую вершину вдоль линии полигона по нормали (наружу) дискретными, но небольшими шагами. Для каждого шага проверяйте, находится ли вершина внутри B. Если нет, то вернитесь в предыдущую позицию. Повторяйте, пока A не станет равным B. Мне не нравится это решение, потому что проверка того, находится ли вершина внутри многоугольника, выполняется медленно.

У кого-нибудь есть другие идеи?


person Martin    schedule 02.08.2011    source источник
comment
Это не совсем подходящий вопрос для переполнения стека. Это слишком широко, и вы в основном просите других написать код для вас (или, по крайней мере, придумать алгоритм для вас).   -  person user1118321    schedule 28.05.2014


Ответы (1)


Если вы хотите, чтобы это было просто и несколько быстро, вы можете продолжить свою последнюю идею, где вы рассматриваете масштабирование полигона A так, чтобы он постепенно заполнил полигон B. Вам не обязательно проверять, все еще ли масштабированные наружу вершины внутри. многоугольник B. В зависимости от того, на что похожа ваша среда кода и API, вы можете замаскировать пиксели расширяющегося многоугольника A контуром многоугольника B.

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

person Mark Schlosser    schedule 10.11.2014