Расчет кубического Безье с известной серединой - PullRequest
5 голосов
/ 01 января 2009

Я знаю:

  • Контрольные точки a и d (начальная и конечная точка 2D кубической кривой Безье)

  • Наклоны a-> b, c-> d и b-> c (b, c других контрольных точек)

  • Где точка середины кривой Безье .

Теперь, учитывая эту информацию, какова формула для положений контрольных точек b и c?

Ответы [ 2 ]

2 голосов
/ 07 июля 2009

Я знаю, что этот вопрос старый, но нет правильного или полного ответа, поэтому я подумал, что я должен принять решение. Обратите внимание, что вычисления Дэвида содержат несколько ошибок, и его решение является неполным, даже если эти ошибки исправлены.

Сначала определите векторы 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.

1 голос
/ 01 января 2009

Допустим, ваши наклоны нормализованы, тогда для некоторого u, v у вас есть

u * slope(a->b)+a = b, v * slope(c->d)+d = c

вы знаете значения a, d и q:=(a+b+c+d)/8 (полпути кривой) итак c = 8(q-a-d-b)

включив вышеприведенные уравнения в последнее, которое вы получите

v * slope(c->d)+d = 8(q-a-d-a-u * slope(a->b))

, что представляет собой 2 уравнения (двумерное векторное уравнение) от двух переменных (u, v)

Вам не нужен третий уклон.

...