Рисование части кривой Безье путем повторного использования базовой функции кривой Безье?
Предполагая, что я использую некоторый графический API, который позволяет мне рисовать
безье, указав 4 необходимые точки:
начало, конец, две контрольные точки.
Могу ли я повторно использовать эту функцию, чтобы нарисовать x% кривой "оригинал"
(путем настройки контрольных точек и конечной точки)?
Или это невозможно?
Ненужная информация, если кому-то нужно:
- Мне нужно все, чтобы рисовать все n% оригинала
кривая безье
с другим цветом и/или стилем линии
-
Я использую Java Path2D для рисования кривых Безье:
Path2D p = new GeneralPath();
p.moveTo(x1, y1);
p.curveTo(bx1, by1, bx2, by2, x2, y2);
g2.draw(p);
Ответы
Ответ 1
Вам нужен алгоритм Де Кастеляу. Это позволит вам разделить свою кривую на любые сегменты, которые вы хотели бы.
Однако, поскольку вы имеете дело с кубическими кривыми, я хотел бы предложить несколько более легкую в использовании формулировку, которая даст вам сегмент от t0
до t1
, где 0 <= t0 <= t1 <= 1
. Здесь некоторый псевдокод:
u0 = 1.0 - t0
u1 = 1.0 - t1
qxa = x1*u0*u0 + bx1*2*t0*u0 + bx2*t0*t0
qxb = x1*u1*u1 + bx1*2*t1*u1 + bx2*t1*t1
qxc = bx1*u0*u0 + bx2*2*t0*u0 + x2*t0*t0
qxd = bx1*u1*u1 + bx2*2*t1*u1 + x2*t1*t1
qya = y1*u0*u0 + by1*2*t0*u0 + by2*t0*t0
qyb = y1*u1*u1 + by1*2*t1*u1 + by2*t1*t1
qyc = by1*u0*u0 + by2*2*t0*u0 + y2*t0*t0
qyd = by1*u1*u1 + by2*2*t1*u1 + y2*t1*t1
xa = qxa*u0 + qxc*t0
xb = qxa*u1 + qxc*t1
xc = qxb*u0 + qxd*t0
xd = qxb*u1 + qxd*t1
ya = qya*u0 + qyc*t0
yb = qya*u1 + qyc*t1
yc = qyb*u0 + qyd*t0
yd = qyb*u1 + qyd*t1
Затем просто нарисуйте кривую Безье, образованную (xa,ya)
, (xb,yb)
, (xc,yc)
и (xd,yd)
.
Обратите внимание, что t0
и t1
не являются точными процентами расстояния кривой, а скорее пространством параметров кривых. Если вы абсолютно должны иметь дистанцию, тогда все намного сложнее. Попробуйте это и посмотрите, делает ли он то, что вам нужно.
Edit: Стоит отметить, что эти уравнения достаточно упрощают, если либо t0
, либо t1
равно 0 или 1 (т.е. вы хотите только обрезать с одной стороны).
Кроме того, отношение 0 <= t0 <= t1 <= 1
не является строгим требованием. Например, t0 = 1
и t1 = 0
могут использоваться для "перевертывания" кривой назад или t0 = 0
и t1 = 1.5
могут использоваться для расширения кривой за исходным концом. Однако кривая может выглядеть иначе, чем вы ожидаете, если попытаетесь расширить ее за пределы диапазона [0,1]
.
Edit2: Через 3 года после моего первоначального ответа MvG указал на ошибку в моих уравнениях. Я забыл последний шаг (дополнительную линейную интерполяцию, чтобы получить конечные контрольные точки). Уравнения выше были исправлены.
Ответ 2
В ответе на еще один вопрос Я просто включил некоторые формулы для вычисления контрольных точек для раздела кубическая кривая. При u= 1 - t кубическая кривая Безье описывается как
B (t) = u 3 P 1 + 3 u 2 t P 2 + 3 ut 2 P 3 + t 3 P 4суб >
P 1 - начальная точка кривой, P 4 ее конечная точка. P 2 и P 3 - контрольные точки.
Учитывая два параметра t 0 и t 1 (и с u 0= (1 - t 0), u 1= (1 - t 1)), часть кривой в интервале [ t 0, t 1] описывается новыми контрольными точками
- Q 1 =
u 0 u 0 u 0 P 1 +
( t 0 u 0 u 0 +
u 0 t 0 u 0 +
u 0 u 0 t 0) P 2 +
( t 0 t 0 u 0 +
u 0 t 0 t 0 +
t 0 u 0 t 0) P 3 +
t 0 t 0 t 0 P <суб > 4суб >
- Q 2 =
u 0 u 0 u 1 P 1 +
( t 0 u 0 u 1 +
u 0 t 0 u 1 +
u 0 u 0 t 1) P 2 +
( t 0 t 0 u 1 +
u 0 t 0 t 1 +
t 0 u 0 t 1) P 3 +
t 0 t 0 t 1 P <суб > 4суб >
- Q 3 =
u 0 u 1 u 1 P 1 +
( t 0 u 1 u 1 +
u 0 t 1 u 1 +
u 0 u 1 t 1) P 2 +
( t 0 t 1 u 1 +
u 0 t 1 t 1 +
t 0 u 1 t 1) P 3 +
t 0 t 1 t 1 P <суб > 4суб >
- Q 4 =
u 1 u 1 u 1 P 1 +
( t 1 u 1 u 1 +
u 1 t 1 u 1 +
u 1 u 1 t 1) P 2 +
( t 1 t 1 u 1 +
u 1 t 1 t 1 +
t 1 u 1 t 1) P 3 +
t 1 t 1 t 1 P <суб > 4суб >
Обратите внимание, что в выраженных в скобках выражениях, по крайней мере, некоторые из терминов равны и могут быть объединены. Я не делал этого, так как формула, как указано здесь, сделает образец более ясным, я считаю. Вы можете просто выполнить эти вычисления независимо для направлений x и y для вычисления ваших новых контрольных точек.
Обратите внимание, что данный процент от диапазона параметров для t вообще не будет соответствовать тому же проценту длины. Таким образом, вам, скорее всего, придется интегрировать по кривой, чтобы вернуть длину пути обратно в параметры. Или вы используете некоторое приближение.