Есть несколько способов выполнить то, что вы видите, в зависимости от того, как вы хотели бы, чтобы оно вело себя. Я объясню некоторые из более простых методов изменения кривой Безье с помощью манипуляции с точкой на кривой.
Первое, что нужно сделать, это выяснить значение параметра (t), где пользователь щелкнул по кривой. Как правило, это будет приблизительным. Если вы выполняете рендеринг Безье по пикселям или субпикселям, просто запишите для каждого пикселя значение t и используйте его. Если вы проводите тесселяцию на отрезки, посмотрите, какой отрезок ближе всего, найдите значения t двух конечных точек и вычислите значение t в соответствии с расстоянием вдоль линии.
Получив значение t, вы можете включить его в уравнение кривой Безье. В итоге вы получите что-то в форме:
P = k0*P0 + k1*P1 + k2*P2 + k3*P3
где P - точка на кривой, P0, P1, P2 и P3 - входные контрольные точки, а k0, k1, k2 и k3 - постоянные для данного t. Я буду называть значения k «взносами», или, более конкретно, вкладами контрольных точек в точку на кривой P (t). Хорошее свойство, которое нужно помнить: k0 + k1 + k2 + k3 = 1.
Итак, допустим, у вас есть вектор V = P '- P, где P' - новая позиция, а P - исходная позиция. Нам нужно переместить некоторые контрольные точки, чтобы получить P 'туда, куда нужно, но у нас есть некоторая гибкость в отношении того, какую из контрольных точек мы хотим переместить. Можно использовать любую точку с ненулевым вкладом или некоторую комбинацию.
Допустим, пользователь нажимает на кривую в момент времени t = 0. В этом случае только k0 не равен нулю, поэтому
P0 := P0 + V
даст правильный результат. Это также можно записать как
P0 := P0 + k0 * V
В общем случае, когда все вклады отличны от нуля, вы можете применить одно и то же преобразование к каждой из точек, что будет иметь эффект очень гладкой разбросанной деформации.
Другой вариант - просто переместить контрольную точку с максимальным вкладом на все расстояние. Я думаю, что уравнение для использования будет что-то вроде
Pmax := Pmax + 1/kmax * V
но в любом случае все сводится к просмотру вкладов при заданном значении t и перемещению контрольных точек, чтобы новая точка находилась в нужном месте.
Этот подход довольно общий и работает для NURBS и большинства других сплайнов, даже поверхностей. Есть еще один довольно распространенный метод, который использует Greville Abscissae, который набирает как можно больше точек, но по моему опыту слишком легко получить колебания.