Существует множество способов достижения того, что вы видите, в зависимости от того, как вы хотите, чтобы он себя вел. Я объясню некоторые из более простых методов модификации кривой Безье через точку манипуляции кривой.
Первое, что нужно сделать, это выяснить значение параметра (t), где пользователь нажал на кривую. Это, как правило, будет приближением. Если вы выполняете пиксельный или субпиксельный рендеринг Bezier, тогда просто записывайте для каждого пикселя значение 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
, но в любом случае она сводится к тому, глядя на вклады в заданном значении т и перемещения контрольных точек, чтобы новая точка находится в нужном месте.
Этот подход является довольно общим и работает для NURBS и большинства других сплайнов, даже поверхностей. Существует еще один довольно распространенный метод, который использует Greville Abscissae, который связывает как можно больше точек, но, по моему опыту, слишком легко получить колебания.
Я должен упомянуть, что с безьерами наиболее близким к совпадению контрольных точек является создание строки из трехточечных кривых. конечная точка каждой кривой устанавливается равной начальной точке следующей кривой. Затем две средние точки с каждой стороны двух точек соединения кривых должны быть настроены на зеркало вокруг точки соединения, что обеспечивает плавное соединение между ними. Однако кривые все равно никогда не пройдут через середину. –