Кривая Безье через три точки

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

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

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

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

3 ответа

Решение

Я просто заглянул в источники 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()" означают две контрольные точки

Кривая Безье - не более чем два полинома: 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

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

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

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

Другие вопросы по тегам