Перетащите кривую Безье для редактирования его

Вы поймете то, что я имею в виду, используете ли Вы графические программы редактирования как Калека или Photoshop. Для редактирования кривой на тех программах (который, вероятно, является Кривой Безье) мы можем нажать на кривую, перетащить мышь, и кривая изменяется соответственно. Я подозреваю, что все вещи позади этого механизма касаются векторов, но я не мог найти документ, упоминающий, как сделать это. Кто-либо мог сказать мне, как я могу сделать это?Большое спасибо.

[редактирование], Что я имел в виду, было к самой избранной кривой для изменения (редактируют) его (нажмите на кривую и перетащите кривую для редактирования ее). Обычным способом мы выбираем контрольные точки для изменения кривой. Я знаю для изменения кривой, я должен отредактировать контрольные точки, но как я интерпретирую изменение на кривой в изменение в изменение в контрольных точках?

6
задан wakandan 23 February 2010 в 09:21
поделиться

5 ответов

РЕДАКТИРОВАТЬ - В ответ на ваш вопрос отредактируйте

Чтобы иметь возможность выбирать саму кривую для перемещения контрольных точек, я бы предложил, чтобы Безье кривые определенно не путь вперед - вам придется решить уравнение в обратном порядке, чтобы найти правильные местоположения контрольных точек. Вы также обнаружите, что в некоторых случаях фактически невозможно переместить контрольные точки, чтобы кривая пошла туда, куда вы хотите.

Если вы использовали B-сплайны, вы могли бы просто вставить новую контрольную точку в точку кривой, ближайшую к тому месту, где щелкнул пользователь, а затем переместить новую контрольную точку. Таким образом, по сути, вы добавляете новую контрольную точку.

Исходный текст

Предположим, у вас уже есть реализация кривой Безье, которая при заданном наборе контрольных точек (обычно три для Безье, но может быть столько, сколько вы хотите) может создать набор точек, которые нужно соединить с линий на устройстве отображения (обычно вы используете параметрическое уравнение 0> = u <= 1 ), тогда это просто.

Ваши контрольные точки определяют, куда идет кривая, поэтому вам просто нужно реализовать обратную связь выбора и перетащить эти контрольные точки.

Однако, если вы ищете точное совпадение точек, кривые Безье не идеальны, поскольку они проходят только через первую и последнюю контрольные точки. И чем больше точек вы добавляете к кривой, тем менее точными они становятся.

B-сплайны были бы лучше, и их вариации - это то, что вы на самом деле видите в Photoshop и др.

1
ответ дан 17 December 2019 в 07:03
поделиться

Перетаскивание просто изменяет контрольные точки кривой Безье, и кривая пересчитывается соответствующим образом. См. Википедию для хорошего объяснения того, как они работают.

0
ответ дан 17 December 2019 в 07:03
поделиться

Уточните, пожалуйста, чем вы хотите заниматься? Вы хотите редактировать кривые Безье в приложении? Вас интересует общая математика, лежащая в основе этого?

Обычно вы манипулируете контрольными точками, которые используются для создания кривой Безье.

0
ответ дан 17 December 2019 в 07:03
поделиться

Есть несколько способов добиться того, что вы видите, в зависимости от того, как вы хотите, чтобы оно вело себя. Я объясню некоторые из более простых методов изменения кривой Безье с помощью манипуляций точка на кривой.

Первое, что нужно сделать, это выяснить значение параметра (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, который фиксирует как можно больше точек, но, по моему опыту, слишком легко получить колебания.

3
ответ дан 17 December 2019 в 07:03
поделиться

Хорошо, давайте предположим, что вам нужно использовать кривые Безье, потому что вы используете библиотеку визуализации, которая имеет их в качестве примитивов. Если вы абсолютно привержены идее использования контрольных точек на самой кривой, вы можете просто интерполировать контрольные точки, используя метод, описанный здесь: Как найти контрольные точки для сегмента Безье с учетом начала, конца и 2 точек пересечения в C # - также известная как кубическая 4-точечная интерполяция Безье

Другими словами, для каждого набора из 4 точек на кривой вы должны запустить вышеуказанный алгоритм и получить 4 контрольные точки, необходимые для рисования кубической кривой Безье.

0
ответ дан 17 December 2019 в 07:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: