Для простоты я буду представлять собой кубическую кривую Безье как 4 точки (А, В, С, D), где А и D являются конечными точками кривой, и В и С являются «контрольные точки управления». (Фактическая кривая обычно не касание контрольных точек управления).
См. "Don Lancaster's Guru's Lair Cubic Spline Library" о способах преобразования этого представления кубической кривой Безье в другие популярные изображения.
интерполяции
Учитывая один кубической кривой Безье (Р0, Р1, Р2, Р3), мы используем De Casteljau's algorithm рубить кривую Безье в левой половины и правой половины. Это супер-легкий даже на микроконтроллер, который не имеет «умножать» инструкцию, , поскольку она требует только вычисления несколько средних, пока мы не получим среднюю точку:
P0
F0 := average(P0, P1)
P1 S0 := average(F0, F1)
F1 := average(P1, P2) Midpoint := average(S0, S1)
P2 S1 := average(F1, F2)
F2 := average(P2, P3)
P3
Вся кривая Безье (P0 , P1, P2, P3).
Левая половина всей кривой Безье представляет собой кривую Безье (P0, F0, S0, M).
Правая половина всей кривой Безье представляет собой кривую Безье (M, S1, F2, P3).
Многих микроконтроллеры продолжают делить каждый кривую вверх на меньшие и меньшие маленькие кривые , пока каждая часть не будет достаточно мала, чтобы аппроксимировать с прямой линией.
Но мы хотим пойти в другую сторону - экстраполировать на большую кривую.
экстраполяция
Учитывая либо левая половина или правая половина, мы можем запустить это в обратном направлении, чтобы восстановить исходную кривую.
Представим себе, что мы забыли исходные точки P1, P2, P3.
Учитывая левую половину кривой Безье (P0, F0, S0, M), мы можем экстраполировать вправо с:
S1 := M + (M - S0)
F1 := S0 + (S0 - F0)
P1 := F0 + (F0 - P0)
затем использовать эти значения для расчета
F2 := S1 + (S1 - F1)
P2 := F1 + (F1 - P1)
и, наконец,
P3 := F2 + (F2 - P2)
экстраполировать и восстановить экстраполировать кривую Bazier (P0, P1, P2, P3).
детали
Экстраполированное кривая (Р0, Р1, Р2, Р3) проходит через каждую точку в исходной кривой (Р0, Р0, S0, М) - в частности, начиная с P0 и проходящей через середину M - и продолжает движение до достижения P3.
Мы всегда можем экстраполировать от любых 4 точек (P0, F0, S0, M), ли эти 4 балла были изначально рассчитаны в левой половине (или правой половине) некоторое увеличение Безье сплайна.
Я уверен, что вы уже знаете об этом, но просто для ясности:
Midpoint = average(F0, F1)
означает «найти среднюю точку точно посередине между точками F0 и F1», или другими словами,
Midpoint.x = (F0.x + F1.x)/2
Midpoint.y = (F0.y + F1.y)/2
Midpoint.z = (F0.z + F1.z)/2
выражение
S1 := M + (M - S0)
означает «Учитывая линейный сегмент, с одним концом в S0, и средняя точка в точке М, старта на S0 и запустить в прямом прошлом М, пока не дойдешь до другого конца на S1" , или других словах (если у вас есть приличный вектор библиотека) 3 строки кода
S1.x := M.x + (M.x - S0.x)
S1.y := M.y + (M.y - S0.y)
S1.z := M.z + (M.z - S0.z)
. (Если вы делаете 2D, пропустите все материалы «z» - это всегда ноль).
MATLAB - это библиотека, которая ищет код, как уже упоминалось. У меня есть ряд точек данных, создающих кривую. Мне нужно немного расширить кривую. Это не сложнее, чем это. –
Ну, просто возьмите последнюю кривую 3-го порядка, которую вы получили, и вычислите нужные значения. Если вы его доработали, у вас уже есть коэффициенты. – Rook
Этот код был написан много лет назад, когда я мог легко сделать этот уровень математики. Теперь мне придется раздирать все это и разобраться в концепциях ... нетривиальных. Я надеялся, что этот пост подскажет ссылку на какой-то код ... –