Как удалить узел кривой Безье, чтобы форма кривой не менялась?

Мне нужна помощь в написании алгоритма удаления узлов кривой Безье. Используя кубические кривые Безье, есть две кривые (P0, P1, P2, P3 и Q0, Q1, Q2, Q3), которые имеют общую точку (P3=Q0). Нужно получить одну кривую (P0, R1, R2, Q3), повторяющую форму двух. Как найти координаты контрольных точек R1, R2?

Спасибо!


person Nekit_SPb    schedule 31.12.2011    source источник
comment
Звучит так, как будто вам нужно будет сделать некоторую интерполяцию P1 по сравнению с Q1 и P2 по сравнению с Q2 - или эта проблема на самом деле сложнее?   -  person Till    schedule 31.12.2011
comment
P1, P2, Q1 и Q2 - контрольные точки кривых Безье. Я не понимаю, о каких интерполяциях вы говорите. Например, в CorelDRAW при удалении узла P0P1 и Q3Q2 направляющие увеличиваются или уменьшаются. Кривая примерно повторяет исходные две. мне нужно сделать что-то подобное   -  person Nekit_SPb    schedule 31.12.2011
comment
Что делать, если комбинированная кривая имеет изгиб? Тот факт, что P3=Q0, не означает, что соединение гладкое. Я думаю, что гладкое продолжение требует, чтобы P2, P3=Q0 и Q1 находились на линии (и, возможно, даже |P3-P2|=|Q1-Q0|, расстояние между P3 и P2 такое же, как расстояние между Q1 и Q0 ).   -  person Uli Schlachter    schedule 31.12.2011
comment
Да, ты прав. Для плавного соединения нужно, чтобы P2, P3 = Q0 и Q1 находились на одной линии. Если нет, то есть изгиб. При этом контрольные точки P2 и Q1 поворачиваются, соединение становится плавным и выполняется преобразование.   -  person Nekit_SPb    schedule 08.01.2012


Ответы (1)


В общем случае невозможно сделать то, что вы просите. Вы просите перейти от 7 степеней свободы к 4, но оставить тот же результат. Репрезентативная мощность системы с более низкой степенью свободы не может соответствовать мощности более высокой. Это было бы возможно только в том случае, если бы более сложная кривая все еще находилась в более простом пространстве. Например, если ваши две кривые Безье получены в результате разделения одной родительской кривой точками R0, R1, R2, R3. Используя алгоритм де Кастельжо, мы можем сгенерировать две новые кривые, P и Q, которые лежат на одной и той же исходной кривой и имеют общую точку, которая находится на расстоянии t вдоль исходной кривой (где t находится в [0,1]).

P0 = R0
P1 = R0*(1-t) + R1*t
X  = R1*(1-t) + R2*t
P2 = P1*(1-t) + X*t
Q3 = R3
Q2 = R2*(1-t) + R3*t
Q1 = X*(1-t) + Q2*t
Q0 = P3 = P2*(1-t) + Q1*t

Если это соотношение не выполняется для ваших исходных точек, вам придется создать приближение. Но вам может сойти с рук притвориться, что связь сохраняется, и просто инвертировать уравнения:

R1 = (P1 - P0*(1-t))/t
R2 = (Q2 - Q3*t)/(1-t)

Где

t = (Q0 - P2)/(Q1 - P2)

Это последнее уравнение является проблемой, потому что, если P2, Q0, Q1 не коллинеарны, оно не будет работать точно. t — это скаляр, но Q1-P2 обычно является n-мерной точкой. Таким образом, вы можете решить его отдельно для каждого измерения и найти среднее значение, или быть немного более изощренным и минимизировать квадрат ошибки.

person JCooper    schedule 30.01.2012