Обратное проектирование кривой Безье - PullRequest
3 голосов
/ 13 июня 2010

Учитывая несколько точек выборки на кривой Безье , возможно ли определить набор возможных кривых, на которых эти точки могут лежать?

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

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

1 Ответ

5 голосов
/ 14 июня 2010

Кривые Безье всегда проходят начальную и конечную контрольные точки.

Если степень кривой равна количеству точек выборки, тогда будет только одна кривая, которая пройдет через все ваши точки (в нормальном случае, когда все точки разные и они не лежат на кривая Безье меньшей степени).

Если степень кривой меньше количества точек выборки, то в общем случае вы не сможете заставить кривую пройти все точки (в обычном случае).

Если степень кривой выше, чем число точек выборки, то в общем случае вы сможете нарисовать бесконечное количество кривых.

В вики-статье вы найдете ссылки только на контрольные точки, но, тем не менее, я верю, что правильно помню вышеуказанные свойства и что они справедливы и для точек на кривых.

Я думаю, вам нужно переопределить ваш вопрос и точно определить, какой тип кривых (и какой степени) вам нужен. Также, как указал Георг, вы можете искать пути - комбинацию кривых.

EDIT : Сначала корректирующая кривая определяется градусом плюс одно число контрольных точек точек (квадратичной необходимости три). Контрольные точки не совпадают с точками на кривой - и для трех точек на кривой и квадратичной кривой вы можете иметь бесконечное число решений (см. это для квадратичной кривой и четырех точек)

Что касается решения (но все еще предполагается, что вы смотрите на одну кривую):

Для уравнения для одиночной квадратичной кривой

B(t) = (1-t)^2*P0 + 2*(1-t)*t*P1 + t^2*P2

Заглавными буквами выше являются векторы, и P0 соответствует начальной контрольной точке (первая точка), P2 соответствует конечной контрольной точке (последняя точка), поэтому вам все равно нужно найти P1. Переменная t является скалярной величиной от 0 до 1.

При работе с 2D-кривыми приведенное выше векторное уравнение дает два скалярных уравнения для каждой точки на кривой.

Тем не менее есть t как неизвестное, поэтому вам нужно взять еще 2 очка (всего 4), что даст вам 4 неизвестных (t для первой точки, t для второй точки, x и y для P1, средней контрольной точки ) и 4 уравнения для решения (2 из каждой точки выборки).

Решите это с помощью вашего любимого численного метода, и вы получите исходную кривую, по которой пришли точки.

Если вы все еще думаете, что можете получить больше кривых и что вам придется что-то выбирать, значит, вы работаете не с кривыми Безье, а с сплайнами Безье (в смысле нескольких кривых, соединенных вместе) , Тем не менее применяется тот же принцип, и если вы разрабатываете способ решения одной кривой из приведенных выше уравнений (и если у вас достаточно точек), то вы можете разделить задачу на n-сегменты реальных кривых Безье и решить каждую, как описано выше.

Если окажется, что у вас недостаточно очков, то снова посмотрите на связанную статью - вы, вероятно, ищете самую плавную кривую, и в статье есть несколько советов о том, как туда добраться. поскольку поиск точного решения (самая короткая кривая / самая гладкая кривая) кажется довольно сложным.

...