Как удалить узел кривой Безье, чтобы форма кривой не изменилась? - PullRequest
3 голосов
/ 31 декабря 2011

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

Спасибо!

1 Ответ

0 голосов
/ 30 января 2012

В общем случае невозможно выполнить то, что вы просите. Вы просите перейти с 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-мерной точкой. Таким образом, вы можете решить ее отдельно для каждого измерения и найти среднее значение, или быть немного более сложным и минимизировать квадрат ошибки.

...