Кривая Безье через три точки - PullRequest
2 голосов
/ 29 января 2011

Я читал похожие темы, чтобы найти решение, но безуспешно.То, что я пытаюсь сделать, это сделать инструмент таким же, как можно найти в CorelDraw, под названием «Pen Tool».Я сделал это, соединив кубические кривые Безье, но все еще пропустив одну особенность, которая заключается в перетаскивании кривой (не контрольной точки) для редактирования ее формы.

Я могу успешно определить параметр «t» на кривой, гдеперетаскивание должно начаться, но я не знаю, как пересчитать контрольные точки этой кривой.

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

Итак, как я могу пересчитать позиции управленияточки при перетаскивании кривой?

Ответы [ 3 ]

3 голосов
/ 30 января 2011

Я только заглянул в источники Inkspace и нашел такой код, может быть, он вам поможет:

// Magic Bezier Drag Equations follow!
// "weight" describes how the influence of the drag should be distributed
// among the handles; 0 = front handle only, 1 = back handle only.
double weight, t = _t;
if (t <= 1.0 / 6.0) weight = 0;
else if (t <= 0.5) weight = (pow((6 * t - 1) / 2.0, 3)) / 2;
else if (t <= 5.0 / 6.0) weight = (1 - pow((6 * (1-t) - 1) / 2.0, 3)) / 2 + 0.5;
else weight = 1;

Geom::Point delta = new_pos - position();
Geom::Point offset0 = ((1-weight)/(3*t*(1-t)*(1-t))) * delta;
Geom::Point offset1 = (weight/(3*t*t*(1-t))) * delta;

first->front()->move(first->front()->position() + offset0);
second->back()->move(second->back()->position() + offset1);

В вашем случае "first-> front ()" и "second-> back ()" означают две контрольные точки

2 голосов
/ 30 января 2011

Кривая Безье - не более чем два полинома: X(t), Y(t).

Кубический:

x = ax*t^3 + bx*t^2 + cx*t + dx
                               0 <= t <= 1
y = ay*t^3 + by*t^2 + cy*t + dy

Так что, если у вас есть кривая - у вас есть коэффициенты поли. Если вы перемещаете свою точку и знаете, что это параметр t - тогда вы можете просто пересчитать коэффициенты поли - это будет система из 6 линейных уравнений для коэффициентов (для каждой точки). Система подразделяется на две системы (x и y) и может быть решена точно или с использованием некоторых численных методов - они тоже не сложны.

Итак, теперь ваша задача - вычислить контрольные точки вашей кривой, когда вы знаете явное уравнение вашей кривой.

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

Кубическая кривая через контрольные точки:

B(t) = (1-t)^3*P0 + 3(1-t)^2*t*P1 + 3(1-t)*t^2*P2 + t^3*P3

Все, что вам нужно сделать, это создать стандартную полиномиальную форму (просто откройте квадратные скобки) и выровнять коэффициенты. Это обеспечит окончательную систему для контрольных точек!

0 голосов
/ 29 января 2011

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

Извините за мой английский

...