Я знаю, что этот вопрос старый, но нет правильного или полного ответа, поэтому я подумал, что я должен принять решение. Обратите внимание, что вычисления Дэвида содержат несколько ошибок, и его решение является неполным, даже если эти ошибки исправлены.
Сначала определите векторы T0
, T1
и T2
, используя три наклона:
T0 = ( b - a ) / u0
T1 = ( c - b ) / u1
T2 = ( d - c ) / u2
Если бы мы знали как направление , так и расстояние между каждой парой контрольных точек, то нам не понадобились бы масштабные коэффициенты u0
, u1
и u2
. Поскольку мы знаем только наклон, то u0
, u1
и u2
являются неизвестными скалярными величинами. Кроме того, мы предполагаем, что u0
, u1
и u2
отличны от нуля, так как наклон определен.
Мы можем переписать эти уравнения несколькими различными способами, чтобы получить выражения для каждой контрольной точки в терминах других контрольных точек. Например:
b = a + T0*u0
c = b + T1*u1
d = c + T2*u2
В вопросе также говорится, что у нас есть «полпути» кубической кривой Безье. Я понимаю, что это означает, что у нас есть точка в средней точке диапазона параметров кривой. Я назову этот пункт p
:
p = ( a + 3*b + 3*c + d ) / 8
Перезапись с неизвестными с левой стороны дает:
b + c = ( 8*p - a - d ) / 3
Теперь мы можем заменить b
и c
различными способами, используя более ранние выражения. Оказывается, неоднозначности возникают, когда у нас есть параллельные векторы T0
, T1
или T2
. Есть четыре случая для рассмотрения.
Случай 1: T0
не параллелен T1
Замените b = a + T0*u0
и c = a + T0*u0 + T1*u1
и решите для u0
и u1
:
2*T0*u0 + T1*u1 = ( 8*p - 7*a - d ) / 3
Это два уравнения и два неизвестных, поскольку T0
и T1
являются векторами. Замените u0
и u1
обратно на b = a + T0*u0
и c = a + T0*u0 + T1*u1
, чтобы получить недостающие контрольные точки b
и c
.
Случай 2: T1
не параллелен T2
Замените c = d - T2*u2
и b = d - T2*u2 - T1*u1
и решите для u1
и u2
:
T1*u1 + 2*T2*u2 = ( a + 7*d - 8*p ) / 3
Случай 3: T0
не параллелен T2
Замените b = a + T0*u0
и c = d - T2*u2
и решите для u0
и u2
:
T0*u0 - T2*u2 = ( 8*p - 4*a - 4*d ) / 3
Случай 4: T0
, T1
и T2
все параллельные
В этом случае a
, b
, c
и d
все коллинеарны, а T0
, T1
и T2
эквивалентны с точностью до масштабного коэффициента. Недостаточно информации для получения уникального решения. Одним простым решением было бы просто выбрать b
, установив u0 = 1
:
b = a + T0
(a + T0) + c = ( 8*p - a - d ) / 3
c = ( 8*p - 4*a - d - 3*T0 ) / 3
Существует бесконечное количество решений. По сути, выбор b
определяет c
или выбор c
будет определять b
.
Расширение до 3D
Вопрос, который специально задавался о плоских кривых Безье, но я думаю, интересно отметить, что точка p
не является необходимой при распространении этой задачи на неплоскую трехмерную кубическую кривую Безье. В этом случае мы можем просто решить это уравнение для u0
, u1
и u2
:
T0*u0 + T1*u1 + T2*u2 = d - a
Это три уравнения (векторы 3D) и три неизвестных (u0
, u1
и u2
). Подстановка в b = a + T0*u0
и c = b + T1*u1
или c = d - T2*u2
дает b
и c
.