1D кубические сплайны Эрмита с нулевыми касательными - как сделать так, чтобы они выглядели более гладкими

Мне дают 3 значения y0, y1, y2, Они должны быть расположены равномерно, скажем, x0 = -0.5, x1 = 0.5, x2 = 1.5, И чтобы можно было провести сплайн через все из них, производные во всех точках называются dy/dx = 0,

Теперь результат рендеринга двух Catmull-Rom-Splines (который выполняется с помощью фрагментного шейдера GLSL, включая нелинейное преобразование) выглядит довольно жестко. Т.е. там, где кривая изгибается, это происходит плавно, но площадь изгиба очень мала. При уменьшении масштаба изгибы выглядят слишком резкими.

Я хотел переключиться на TCB-Splines (он же Kochanek-Bartels Splines), так как они предоставляют параметр натяжения - поэтому я надеялся, что смогу сгладить внешний вид. Но я понял, что все TCB-параметры, примененные к нулевой касательной, не принесут пользы.

Любые идеи, как я мог бы получить более гладкую кривую?

2 ответа

Решение

Очевидно, что никто не дал хорошего ответа, но так как это моя работа, я нашел решение: точки распределены равномерно, и идея состоит в том, чтобы сделать переходы более плавными. Теперь дано, что касательные равны нулю во всех заданных точках, поэтому наиболее вероятно, что вблизи точек мы получим самую сильную кривизну y''(x). Это означает, что мы хотели бы растянуть эти "области вокруг точек".

Учитывая, что в настоящее время мы используем Catmull-Rom-Splines, разделенные между точками. Что делает y(x) => y(t) , t(x) = x-x0,

это t(x) нужно растянуть вокруг 0- и 1-areas. Итак, функция косинуса запала мне в голову:

Замена t(x) = x-x0 с t(x) = 0.5 * (1.0 - cos( PI * ( x-x0 ) ) сделал работу за меня.

Краткое объяснение:

  • косинус в диапазоне [0,PI] бежит плавно от 1 в -1,
  • мы хотим убежать от 0 в 1, хоть
  • так что переверните это: 1-cos() -> теперь он бежит из 0 в 2
  • разделить пополам 0.5*xxx -> теперь он бежит из 0 в 1

Еще одной проблемой было найти правильные касательные. Обычно, вычисляя такой сплайн с помощью Matrix-Vector-Math, вы просто выводите t-vector чтобы получить касательные, поэтому вывод [t³ t² t 1] доходность [3t² 2t 1 0], Но здесь, t не просто Используя это, я нашел правильный производный вектор:

| 0.375*PI*sin(PI*t)(1-cos(PI*t))² |
| 0.500*PI*sin(PI*t)(1-cos(PI*t))  |
| 0.500*PI*sin(PI*t)               |
| 0                                |

Вектор касательной для двумерной параметрической кривой f(t)=(x(t), y(t)) определяется как f'(t)=(dx(t)/dt, dy(t)/dt). Когда вам требуется, чтобы ваша кривая имела dy/dx = 0 в некоторых точках, это просто означает, что касательный вектор в этих точках будет идти горизонтально (т.е. dy/dt = 0). Это не обязательно означает, что касательный вектор сам по себе является нулевым вектором. Таким образом, вы все еще должны иметь возможность использовать сплайн TCB, чтобы делать все, что вы хотите.

Другие вопросы по тегам