Если вам нужна функция, которая объединяет n и yes / no в одной функции, вы можете сделать:
Что вам нужно, так это алгоритм Де Кастельжау . Это позволит вам разделить вашу кривую на любые сегменты, которые вам нужны.
Однако, поскольку вы имеете дело только с кубическими кривыми, я хотел бы предложить немного более простую в использовании формулировку, которая даст вам сегмент от 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 указал на ошибку в моих уравнениях. Я забыл последний шаг (дополнительная линейная интерполяция для получения окончательных контрольных точек). Приведенные выше уравнения были исправлены.