Подход к достижению нелинейной интерполяции?

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

У меня есть базовое представление о том, как это сделать, но я не уверен, что это будет самое эффективное решение. Моя идея в основном такова:

Используйте двумерную кубическую, квадратичную кривую или кривую Безье n-го порядка для управления интерполяцией. Пройдитесь по кривой линейно, чтобы получить нелинейную компоненту Y, и используйте ее для значения, чтобы передать простой метод линейной интерполяции:

value = v1 + (v2 - v1) * t;

Где t — нелинейная компонента Y контрольной кривой.

Это позволяет использовать пользовательские методы интерполяции, определяемые пользователем, но за это приходится платить: стоимость одной нелинейной интерполяции равна:

1 + 2 * (n-1)

общее количество интерполяций, где n — порядок или количество контрольных точек контрольной кривой.

Я НЕ МАТЕМАТИК, это лучшее, что я мог придумать, поэтому мой вопрос в том, есть ли лучшее решение?

РЕДАКТИРОВАТЬ: я, вероятно, неправильно объясняю, я не носитель языка, поэтому, надеюсь, все поймут:   интерполяция контрольной кривой


person dtech    schedule 10.04.2012    source источник
comment
Лучшее решение для чего конкретно? Интерполяция вообще или просто более эффективный алгоритм Безье? Каковы ваши ограничения?   -  person Oliver Charlesworth    schedule 11.04.2012
comment
Как вы создадите кубическую или квадратичную кривую для управления интерполяцией? Просто угадал?   -  person Dan W    schedule 11.04.2012
comment
@DanW - изменяющийся наклон кривой используется как t для интерполяции, в основном вместо получения линейного изменения от v1 до v2 положение интерполированного значения определяется компонентом Y контрольной кривой.   -  person dtech    schedule 11.04.2012
comment
Кривая Безье — прекрасный пример нелинейной интерполяции. Если вы хотите, чтобы объект перемещался по кривой с постоянной скоростью, см. этот ответ. Иначе я не понимаю, в чем ваш вопрос.   -  person BlueRaja - Danny Pflughoeft    schedule 11.04.2012
comment
@BlueRaja-DannyPflughoeft - на самом деле ваша ссылка полезна в другом, так что спасибо, что подняли ее, однако это не тема этого вопроса, посмотрите изображение, которое я добавил, возможно, оно станет яснее. Спасибо!   -  person dtech    schedule 11.04.2012
comment
Повторите ваше редактирование: я до сих пор не понимаю, почему нормальная кривая Безье не соответствует вашим требованиям. Если вы беспокоитесь о том, что это не будет строго увеличиваться, см. -functions">этот вопрос. В противном случае, с информацией, которую мы получили, просто используйте кривую Безье (или любой другой сплайн) — это лучший ответ, который мы можем дать.   -  person BlueRaja - Danny Pflughoeft    schedule 11.04.2012
comment
@BlueRaja-DannyPflughoeft - мне нужно иметь возможность использовать разные кривые для управления интерполяцией между двумя значениями, например, в анимации или рисовании градиентов и тому подобное. Приведенный выше пример относится к простой анимации, анимация начинается медленно и быстро увеличивает свою скорость, а затем снова замедляется, это то, чего мне нужно достичь, это метод, который я придумал сам, поэтому мой вопрос: это нормально и если нет, если есть лучший способ сделать это. Спасибо!   -  person dtech    schedule 11.04.2012
comment
Ищите вопросы на SO для упрощения/упрощения. Одним из простых решений для вашего случая было бы использование сигмовидной функции.   -  person BlueRaja - Danny Pflughoeft    schedule 11.04.2012
comment
Я не хочу использовать только ЭТУ конкретную кривую, это было просто для примера, но любая кривая с изменяющимся наклоном, например, мне также может понадобиться очень быстро запустить анимацию и просто ослабить ее.   -  person dtech    schedule 11.04.2012


Ответы (1)


Насколько я понимаю, ваш t на самом деле представляет собой семейство функций fi(u), где как u, так и f< sub>i(u) находится в диапазоне от 0 до 1. Если это так, то ничего лучше, чем то, что вы уже предложили, не будет.

Похоже, вы беспокоитесь об оценке этих значений fi(u) во время фактического расчета кривой. Невозможно избежать оценки, если вы не хотите предварительно рассчитывать. Если производительность имеет большое значение и вам не нужна высокая точность, вы можете рассчитать таблицы fi(uj) для столько значений uj, сколько вы хотите (скажем, 100 или 1000 дискретных точек между 0 и 1) для каждой из ваших кривых, и когда вам нужно значение между точками выборки , выполните простую линейную интерполяцию двух кэшированных значений вокруг нужной точки.

person vhallac    schedule 10.04.2012
comment
Спасибо, это все, что мне нужно было знать. Идея в основном состоит в том, чтобы создать семейство классов, один из которых описан вами, возвращающий значения от 0 до 1, но также и другие, которые пользователь может установить другие значения и тип, например, вам может понадобиться случайное число от 0 до 3, но вам нужен контроль над вероятностью возврата любого из этих чисел, например, вы хотите 70% шансов на 0, 20% шансов на 1, 7% шансов на 2 и только 3% на 1, а также контролировать циклы while для создавать пользовательские, нелинейные циклы for и другие подобные вещи... - person dtech; 11.04.2012