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