Создание непрерывных сплайнов / Создание плавного перехода между сплайнами - PullRequest
6 голосов
/ 16 июня 2011

Я работаю над проектом, который включает в себя создание сплайна из заданного набора точек (десятки тысяч точек).

Сначала я создаю сплайн для первых 1000 точек и моделирую «движение»на этом пути со стрелкой (он рисуется с использованием касательной и текущей точки на сплайне).Когда я приближаюсь к концу пути, я беру следующие 1000 точек, создаю новый сплайн и продолжаю свое "движение".

Проблема, с которой я столкнулся, заключается в том, что сплайны (предыдущий сплайн и текущий сплайн) не совпадают в конце.Под несоответствием я подразумеваю, что они не имеют одинаковую касательную (первая производная не совпадает), и есть разница между последней точкой предыдущего сплайна и первой точкой нового сплайна (это потому, что я не используюинтерполирующий сплайн, но гладкий сплайн - см. ПРИМЕЧАНИЕ 1 ниже).Это заставляет мою стрелку «прыгать» в конце сплайна при переключении на вновь созданный сплайн.

NOTE1 : я НЕ , используя интерполяционные сплайны.Я использую плавные сплайны.См. здесь и здесь для получения более подробной информации.Это означает, что набор точек, заданных в качестве входных данных, может не находиться на результирующем сплайне (в моем случае они довольно близки к сплайну, но обычно НЕ на сплайне).

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

NOTE3 : вычисление сплайна длявесь набор точек занимает много времени (более 30 секунд) на ПК с частотой 3 ГГц и 2 ГБ ОЗУ (наша целевая платформа для приложения);об этом также не может быть и речи.

Мне было бы интересно преодолеть этот нежелательный «скачок» при переключении сплайнов.

Итак, мои вопросы:

  • Есть ли какие-нибудь способы / алгоритмы для плавного «перехода» / перехода к новому сплайну?
  • Можно ли что-то сделать с помощью специального типа сплайна, чтобы преодолеть это?(Это то, что я пробовал до сих пор без значительного улучшения).

Спасибо за любые идеи,

Юлиан

1 Ответ

4 голосов
/ 16 июня 2011

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

Например, сгенерировать плавный сплайн для точек 1-1000. Пока вы анимируете от 1 до 900, создайте следующий сплайн из 901-1900. Для области между 901 и 1000 используйте взвешенную комбинацию соответствующих позиций в обоих сплайнах, где взвешивание составляет 1: 0 при 901 и 0: 1 при 1000. То же самое для 1801-1900 и т. Д.

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

...