Tracing Cubi c Интерполированный путь - PullRequest
1 голос
/ 05 февраля 2020

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

mu2 = mu*mu;
a0 = -0.5*x0 + 1.5*x1 - 1.5*x2 + 0.5*x3;
a1 = x0 - 2.5*x1 + 2*x2 - 0.5*x3;
a2 = -0.5*x0 + 0.5*x2;
a3 = x1;

interpolated_x = (a0*mu*mu2+a1*mu2+a2*mu+a3)

Когда я пытаюсь отследить сегмент на пути с помощью итерации mu от 0,0 до 1,0, расстояния не равны. На снимке экрана красные точки - это точки пути, зеленые и синие - контрольные точки для расчета кривой.

enter image description here

Есть ли Как я могу рассчитать процент пройденного расстояния сегмента, который дает мне равные расстояния?

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

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Чтобы обеспечить одинаковый интервал, вам нужно получить отрезки кривой одинаковой длины. Обратите внимание, что длина кривой (как для всей кривой, так и для ее фрагмента) может быть рассчитана с использованием интегрирования ( в параметре c форма отсюда )

ds = Sqrt((dx/dt)^2+(dy/dt)^2)*dt
L = Integral{t=a..b} (ds), where t = 0..1 for overall length.

К сожалению, для cubi c Кривые такого интеграла (здесь это elliptic) не могут быть решены аналитически и должны быть рассчитаны численно. Это хорошо известная проблема для кривых Безье, например.

Таким образом, чтобы построить отрезки равной длины, вам нужно численно найти длину L всей кривой, найти l[i]=i*L/n для положения i-й точки. и численно найти (например, с двоичным поиском) параметр для этой позиции.

0 голосов
/ 05 февраля 2020

Эта функция интерполирует между x_1 и x_2 для значений mu=0..1. Но если вы вычислите скорость xp = diff(x, mu) в конечных точках, вы найдете

xp_1 = (x_2-x_0)/2                    xp_2 = (x_3-x_1)/2

Так что, если скорость не равна и конечные точки, она будет варьироваться в зависимости от местоположения. Даже если в конечных точках оно было равно v = (x_2-x_0)/2 = (x_3-x_1)/2 или

x_0 = x_2 -2 v                       x_3 = 2 v + x_1

или функции скорости

xp = v - 6*mu*(v+x_1-x_2) + 6*mu2*(v+x_1-x_2)

Чтобы сделать скорость постоянной, v+x_1-x_2 = 0 или v=x_2-x_1 который выдает функцию линейной интерполяции

xp = x_2 - x_1
x = x_1 + mu*(x_2-x_1)

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

...