2010-02-23 3 views
6

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

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

ответ

0

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

0

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

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

1

EDIT - В ответ на ваш вопрос редактировать

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

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

Первоначальный текст

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

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

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

B-сплайны были бы лучше, а их вариации - то, что вы действительно видите в photoshop et al.

+0

Я должен упомянуть, что с безьерами наиболее близким к совпадению контрольных точек является создание строки из трехточечных кривых. конечная точка каждой кривой устанавливается равной начальной точке следующей кривой. Затем две средние точки с каждой стороны двух точек соединения кривых должны быть настроены на зеркало вокруг точки соединения, что обеспечивает плавное соединение между ними. Однако кривые все равно никогда не пройдут через середину. –

0

ОК, поэтому давайте предположим, что вам нужно использовать кривые Безье, потому что вы используете библиотеку рендеринга, которая имеет их как примитив.Если вы абсолютно женаты на идее использования контрольных точек на самой кривой, вы можете просто интерполировать контрольные точки, используя метод, описанный здесь: How to find control points for a BezierSegment given Start, End, and 2 Intersection Pts in C# - AKA Cubic Bezier 4-point Interpolation

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

3

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

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

0

См github.com/bootchk/freehandTool для объектных моделей

пользователь тащит. Проецируйте перетаскивание на ближайшую контрольную точку или рычаг между контрольными точками. Интерпретируйте перетаскивание как поворот и/или трансляцию (преобразование) указанных ближайших контрольных точек.Примечание множественное число: ближайшими могут быть совпадающие контрольные точки (концы) двух сегментов или контрольные точки плеча сегмента безье.