Рисование части Bézier изгибается путем многократного использования основного Bézier-curve-function?

Если вам нужна функция, которая объединяет n и yes / no в одной функции, вы можете сделать:

13
задан ivan_ivanovich_ivanoff 18 May 2009 в 17:28
поделиться

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

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

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

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

19
ответ дан 1 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: