Реверс-инжиниринг кривой Безье

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

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

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


person Martin    schedule 13.06.2010    source источник
comment
подгонка точек с использованием одной кривой Безье... конечно, это можно сделать (так же, как вы бы подогнали точки с помощью функции - кривая Безье - это функция), а предоставленная вами ссылка уже говорит о RE кривой Безье   -  person ShinTakezou    schedule 13.06.2010
comment
Да, но я хочу знать все возможные кривые, на которых лежат эти точки. Кривая, начинающаяся в первой точке и заканчивающаяся в последней точке, является лишь одной из множества кривых.   -  person Martin    schedule 13.06.2010
comment
с квадратичными кривыми Безье у вас либо есть только одна кривая, либо менее четырех точек, через которые проходит кривая. Кроме того, если у вас есть более четырех независимых точек, вы не сможете найти одну квадратичную кривую Безье, которая проходит через все эти точки.   -  person Unreason    schedule 15.06.2010


Ответы (1)


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

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

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

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

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

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

РЕДАКТИРОВАТЬ: сначала коррекция - кривая определяется с помощью степени плюс одно количество контрольных точек точек (для квадратичных требуется три). Контрольные точки — это не то же самое, что точки на кривой — и для трех точек на кривой и квадратичной кривой у вас может быть бесконечное количество решений (см. pdf" rel="nofollow noreferrer">это для квадратичной кривой и четырех точек)

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

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

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-сегменты реальных кривых Безье и решить каждый, как описано выше.

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

person Unreason    schedule 14.06.2010
comment
Я добавил немного больше к вопросу, как вы спросили :) - person Martin; 15.06.2010
comment
Я добавил немного больше к ответу, который я дал :) - person Unreason; 15.06.2010
comment
Спасибо, это выглядит довольно хорошо. Я посмотрю, чтобы попробовать это в ближайшие несколько дней. - person Martin; 16.06.2010
comment
как изменится уравнение, если мне нужно увеличить контрольные точки? Допустим, у нас есть 3, что, если рассматриваемые точки относятся к кривой Безье с 4 контрольными точками? - person Rana Tallal; 05.11.2018