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