Можна наблизити рішення цієї проблеми для більшості параметричних траєкторій. Ідея полягає в наступному: якщо ви наближаєтесь до кривої досить глибоко, ви не зможете в цій точці позначити саму криву від її дотичної.
Здійснюючи це припущення, немає необхідності попередньо обчислювати більше двох векторів (три для кубічних кривих Безьє тощо ).
Отже для кривої M(t) обчислюємо її дотичний вектор dMdt у точціt. Норма цього вектора∥dMdT∥і, таким чином, пройдена відстань протягом тривалостіΔtможе бути приблизна як. Звідси випливає, що відстаньпройде протягом тривалості.∥dMdT∥ΔtLL÷∥dMdT∥
Застосування: квадратична крива Безьє
Якщо контрольними точками кривої Безьє є , і , траєкторію можна виразити так:ABC
M(t)=(1−t)2A+2t(1−t)B+t2C=t2(A−2B+C)+t(−2A+2B)+A
Отже, похідна:
dMdt=t(2A−4B+2C)+(−2A+2B)
Вам просто потрібно десь зберігати вектори і . Тоді для заданого , якщо ви хочете просунути довжину , зробіть:v⃗ 1=2A−4B+2Cv⃗ 2=−2A+2BtL
t=t+Llength(t⋅v⃗ 1+v⃗ 2)
Кубічні криві Безьє
Це ж міркування стосується кривої з чотирма контрольними точками , , і :ABCD
M(t)=(1−t)3A+3t(1−t)2B+3t2(1−t)C+t3D=t3(−A+3B−3C+D)+t2(3A−6B+3C)+t(−3A+3B)+A
Похідна:
dMdt=t2(−3A+9B−9C+3D)+t(6A−12B+6C)+(−3A+3B)
Ми попередньо обчислюємо три вектори:
v⃗ 1v⃗ 2v⃗ 3=−3A+9B−9C+3D=6A−12B+6C=−3A+3B
і остаточна формула:
t=t+Llength(t2⋅v⃗ 1+t⋅v⃗ 2+v⃗ 3)
Питання точності
Якщо ви працюєте з розумним кадром, (який слід обчислити відповідно до тривалості кадру) буде достатньо малим для наближення до роботи.L
Однак у крайніх випадках у вас можуть виникнути неточності. Якщо занадто великий, ви можете зробити обчислення кусочно, наприклад, використовуючи 10 частин:L
for (int i = 0; i < 10; i++)
t = t + (L / 10) / length(t * v1 + v2);