Для простоты я собираюсь представить кубическую кривую Безье
как 4 балла (A, B, C, D),
где A и D являются конечными точками кривой,
B и C - это «точки управления».
(Фактическая кривая обычно не касается точек управления).
См. "Библиотека кубических сплайнов в логове гуру дона Ланкастера"
способы преобразования этого представления кубической кривой Безье
в другие популярные представления.
интерполяция
Учитывая одну кубическую кривую Безье (P0, P1, P2, P3),
мы используем алгоритм де Кастельжау
нарезать кривую Безье в
левая половина и правая половина.
Это очень просто даже на микроконтроллере, который не имеет инструкции «умножения»,
потому что требуется только вычисление нескольких средних, пока мы не получим среднюю точку:
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)
для экстраполяции и восстановления экстраполированной кривой Базье (P0, P1, P2, P3).
подробности
Экстраполированная кривая (P0, P1, P2, P3)
проходит через каждую точку в исходной кривой
(P0, F0, S0, M) -
в частности, начиная с 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 и средней точкой в M,
начинайте с S0 и бегите по прямой после M, пока не дойдете до другого конца на 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" - это всегда ноль).