Это называется "проблемой вставки узла". Для кривых Безье алгоритм де Кастельжау даст правильный ответ. Вот простой алгоритм для степени 3 Безье.
Скажем, вы хотите вставить узел в доле t
пространства параметров внутри кривой Безье, определяемой P0, P1, P2, P3
. Вот что вы делаете:
P0_1 = (1-t)*P0 + t*P1
P1_2 = (1-t)*P1 + t*P2
P2_3 = (1-t)*P2 + t*P3
P01_12 = (1-t)*P0_1 + t*P1_2
P12_23 = (1-t)*P1_2 + t*P2_3
P0112_1223 = (1-t)*P01_12 + t*P12_23
Тогда ваш первый Безье будет определяться как: P_0, P0_1, P01_12, P0112_1223
; Ваш второй Безье определяется как: P0112_1223, P12_23, P2_3, P3
.
Геометрическая интерпретация проста: вы разделяете каждый сегмент многоугольника Безье на дробь t
, затем соединяете эти точки разбиения в новый многоугольник и выполняете итерацию. Когда у вас остается 1 точка, эта точка лежит на кривой, а предыдущие / следующие точки разделения образуют предыдущий / следующий многоугольник Безье. Тот же алгоритм работает и для кривых Безье более высокой степени.
Теперь может быть сложнее, если вы хотите вставить контрольную точку не при конкретном значении t
, а в определенном месте в пространстве. Лично я хотел бы просто выполнить бинарный поиск значения t
, которое близко к желаемой точке разделения ... Но если производительность критична, вы, вероятно, сможете найти более быстрое аналитическое решение.