Рисование части кривой Безье с помощью повторного использования базовой функции кривой Безье? - PullRequest
13 голосов
/ 18 мая 2009

Если я использую некоторый графический 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);
    

Ответы [ 2 ]

18 голосов
/ 18 мая 2009

Что вам нужно, это алгоритм де Кастельжау . Это позволит вам разбить вашу кривую на любые сегменты, которые вы хотите.

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

Редактировать: Стоит отметить, что эти уравнения сильно упрощаются, если либо t0, либо t1 равен 0 или 1 (т.е. вы хотите обрезать только с одной стороны).

Кроме того, отношения 0 <= t0 <= t1 <= 1 не являются строгими требованиями. Например, t0 = 1 и t1 = 0 могут быть использованы для "переворачивания" кривой назад, или t0 = 0 и t1 = 1.5 могут быть использованы для удлинения кривой за исходный конец. Однако кривая может выглядеть иначе, чем вы ожидаете, если вы попытаетесь расширить ее за пределы диапазона [0,1].

Edit2: Более чем через 3 года после моего первоначального ответа MvG указала на ошибку в моих уравнениях. Я забыл последний шаг (дополнительная линейная интерполяция для получения конечных контрольных точек). Приведенные выше уравнения были исправлены.

9 голосов
/ 29 июля 2012

В ответ на другой вопрос Я просто включил некоторые формулы для вычисления контрольных точек для участка кубической кривой. При u = 1 - t кривая Безье кубического типа описывается как

B ( t ) = u 3 P 1 + 3 u 2 т P 2 + 3 ut 2 P 3 + т 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 + ( т 0 u 0 u 0 + u 0 т 0 u 0 + u 0 u 0 t 0 ) P 2 + ( т 0 т 0 u 0 + u 0 т 0 т 0 + т 0 u 0 т 0 ) P 3 + т 0 т 0 т 0 P 4
  • Q 2 = u 0 u 0 u 1 P 1 + ( т 0 u 0 u 1 + u 0 t 0 u 1 + u 0 u 0 t 1 ) P 2 + ( т 0 т 0 u 1 + u 0 т 0 т 1 + т 0 u 0 т 1 ) P 3 + т 0 т 0 т 1 P 4
  • Q 3 = u 0 u 1 u 1 P 1 + ( т 0 u 1 u 1 + u 0 т 1 u 1 + u 0 u 1 t 1 ) P 2 + ( т 0 т 1 u 1 + u 0 т 1 т 1 + т 0 u 1 т 1 ) P 3 + т 0 т 1 т 1 P 4
  • Q 4 = u 1 u 1 u 1 P 1 + ( т 1 u 1 u 1 + u 1 t 1 u 1 + и 1 и 1 т 1 ) П 2 + ( т 1 т 1 u 1 + и 1 т 1 т 1 + t 1 u 1 t 1 ) P 3 + т 1 т 1 т 1 P 4

Обратите внимание, что в выражениях в скобках, по крайней мере, некоторые термины равны и могут быть объединены. Я не сделал этого, так как формула, изложенная здесь, сделает образец более ясным, я полагаю. Вы можете просто выполнить эти вычисления независимо для направлений x и y , чтобы вычислить ваши новые контрольные точки.

Обратите внимание, что данный процент диапазона параметров для t в общем случае не будет соответствовать этому же проценту длины. Таким образом, вам, скорее всего, придется интегрировать по кривой, чтобы превратить длину пути обратно в параметры. Или вы используете какое-то приближение.

...