Задать вопрос

Как сравнить форму кривых Безье?

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

Известны координаты точек и якорей. Эти координаты для двух сравниваемых кривых не совпадают. Количество точек на кривой тоже может быть различным. Нужно сравнивать именно форму. Для true форма должна "примерно" совпадать.

Нашел $1 recognizer, но как я понял, с Безье кривыми он не работает.

Посмотрите пожалуйста картинку:
8256e536c9ce4f01bf12d792473038d5.png
  • Вопрос задан
  • 3031 просмотр
Подписаться 6 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
@Sumor
Искривление зависит от знаков второй производной. Если у вас несколько соединённых кривых Безье, то на границе вторая производная может не существовать.
Если используются кубические кривые Безье, то вторая производная это линейная функция. Поэтому для одного отрезка могут быть варианты:
1. Вторая производная положительна.
2. Вторая производная отрицательна.
3. Вторая производная меняет знак с плюса на минус.
4. Вторая производная меняет знак с минуса на плюс.
Поэтому, чтобы сравнить две кривые, состоящие из нескольких кривых Безье, можно каждый отрезок каждой кривой классифицировать по виду второй производной и сравнить классификацию.
Ответ написан
@SeptiM
Если я правильно понимаю, вы хотите сравнивать с точностью до искривления. Я бы составил параметрическое уравнение кривой и взял вторую производную d^2 f / dt^2. В каждой точке это будет нормаль к кривой. Нужно для каждой кривой записать последовательность, когда эта нормаль слева от кривой, когда равна нулю (кривая идет прямо или точка перегиба), когда справа. Получится такая строчка, например, +1,0,-1,...,1. Ну и их сравнивать.

Знак можно получить, например посчитав детерминант матрица 2x2 составленный из векторов для первой и второй производной. Можно попробовать сделать это сначала численно. Если подходит, попробовать решить аналитически.
Ответ написан
Flanker_4
@Flanker_4
Если нужен распознаватель только для двух форм
"( "
и
"~"
То можно просто строить прямую между начальной и конечной точкой кривой, а дальше проверять, находятся ли все якоря по одну сторону от прямой [Значит у нас "(" ] или нет [Значит "~"]
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы