Вы поймете то, что я имею в виду, используете ли Вы графические программы редактирования как Калека или Photoshop. Для редактирования кривой на тех программах (который, вероятно, является Кривой Безье) мы можем нажать на кривую, перетащить мышь, и кривая изменяется соответственно. Я подозреваю, что все вещи позади этого механизма касаются векторов, но я не мог найти документ, упоминающий, как сделать это. Кто-либо мог сказать мне, как я могу сделать это?Большое спасибо.
[редактирование], Что я имел в виду, было к самой избранной кривой для изменения (редактируют) его (нажмите на кривую и перетащите кривую для редактирования ее). Обычным способом мы выбираем контрольные точки для изменения кривой. Я знаю для изменения кривой, я должен отредактировать контрольные точки, но как я интерпретирую изменение на кривой в изменение в изменение в контрольных точках?
РЕДАКТИРОВАТЬ - В ответ на ваш вопрос отредактируйте
Чтобы иметь возможность выбирать саму кривую для перемещения контрольных точек, я бы предложил, чтобы Безье кривые определенно не путь вперед - вам придется решить уравнение в обратном порядке, чтобы найти правильные местоположения контрольных точек. Вы также обнаружите, что в некоторых случаях фактически невозможно переместить контрольные точки, чтобы кривая пошла туда, куда вы хотите.
Если вы использовали B-сплайны, вы могли бы просто вставить новую контрольную точку в точку кривой, ближайшую к тому месту, где щелкнул пользователь, а затем переместить новую контрольную точку. Таким образом, по сути, вы добавляете новую контрольную точку.
Исходный текст
Предположим, у вас уже есть реализация кривой Безье, которая при заданном наборе контрольных точек (обычно три для Безье, но может быть столько, сколько вы хотите) может создать набор точек, которые нужно соединить с линий на устройстве отображения (обычно вы используете параметрическое уравнение 0> = u <= 1
), тогда это просто.
Ваши контрольные точки определяют, куда идет кривая, поэтому вам просто нужно реализовать обратную связь выбора и перетащить эти контрольные точки.
Однако, если вы ищете точное совпадение точек, кривые Безье не идеальны, поскольку они проходят только через первую и последнюю контрольные точки. И чем больше точек вы добавляете к кривой, тем менее точными они становятся.
B-сплайны были бы лучше, и их вариации - это то, что вы на самом деле видите в Photoshop и др.
Перетаскивание просто изменяет контрольные точки кривой Безье, и кривая пересчитывается соответствующим образом. См. Википедию для хорошего объяснения того, как они работают.
Уточните, пожалуйста, чем вы хотите заниматься? Вы хотите редактировать кривые Безье в приложении? Вас интересует общая математика, лежащая в основе этого?
Обычно вы манипулируете контрольными точками, которые используются для создания кривой Безье.
Есть несколько способов добиться того, что вы видите, в зависимости от того, как вы хотите, чтобы оно вело себя. Я объясню некоторые из более простых методов изменения кривой Безье с помощью манипуляций точка на кривой.
Первое, что нужно сделать, это выяснить значение параметра (t), в котором пользователь щелкнул кривую. Обычно это приближение. Если вы выполняете пиксельный или субпиксельный рендеринг Безье, просто запишите для каждого пикселя значение t и используйте его. Если вы занимаетесь мозаикой в сегменты линии, посмотрите, какой сегмент линии ближе всего, найдите значения t двух конечных точек и измерьте значение t в соответствии с расстоянием вдоль линии.
Получив значение t, вы можете подставить его в уравнение кривой Безье. В итоге вы получите что-то вроде:
P = k0*P0 + k1*P1 + k2*P2 + k3*P3
где P - точка на кривой, P0, P1, P2 и P3 - входные контрольные точки, а k0, k1, k2 и k3 - константы для учитывая т. Я назову значения 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, который фиксирует как можно больше точек, но, по моему опыту, слишком легко получить колебания.
Хорошо, давайте предположим, что вам нужно использовать кривые Безье, потому что вы используете библиотеку визуализации, которая имеет их в качестве примитивов. Если вы абсолютно привержены идее использования контрольных точек на самой кривой, вы можете просто интерполировать контрольные точки, используя метод, описанный здесь: Как найти контрольные точки для сегмента Безье с учетом начала, конца и 2 точек пересечения в C # - также известная как кубическая 4-точечная интерполяция Безье
Другими словами, для каждого набора из 4 точек на кривой вы должны запустить вышеуказанный алгоритм и получить 4 контрольные точки, необходимые для рисования кубической кривой Безье.