Подтвердить что ты не робот

Рисование части кривой Безье путем повторного использования базовой функции кривой Безье?

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

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