Генерация кубической кривой Безье из грубых точек - PullRequest
1 голос
/ 12 июля 2010

Я ищу способ, чтобы мое приложение показывало более плавные результаты в режиме рукописного ввода. Прямо сейчас он просто добавляет каждую точку мыши и делает из этого многоугольник. Я заметил, что современные векторные приложения создают кривые Безье, чтобы они выглядели намного более плавными, и мне интересно, как это сделать? Итак, как я могу получить 4 точки, чтобы сделать интерполяцию Безье с грубым пользовательским вводом гладкой кривой?

Спасибо

Ответы [ 4 ]

0 голосов
/ 15 июля 2010

Вы также можете использовать сглаживающий сплайн.Если вы в порядке с GPL, посмотрите GSL http://www.gnu.org/software/gsl/ для реализации.

0 голосов
/ 15 июля 2010

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

Основная идея:
Петля:

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

  4. суммируйте квадраты оставшихся точек для оценки.
  5. оставьте решение с лучшим счетом.

Чтобы сделать это действительно вымогательским,вам нужно найти функцию для 4, которая решает вашу первоначальную проблему.D'о.То есть вы должны иметь возможность рассчитать кривую на основе всех точек, которые не были устранены на шаге 3. Именно поэтому я предложил выше.Это быстро и легко, и может подойти к вам очень близко, тем более что у вас действительно нет грубых выбросов.

0 голосов
/ 15 июля 2010

Если вы хотите решить общую проблему, вы можете использовать оптимизацию levenberg-marquardt ( LM ).

Вы хотите определить кривую Безье с небольшим количеством точек.Вы используете LM для оптимизации параметров кривой (местоположения точек) путем минимизации квадрата расстояния до кривой для всех ваших точек.Это ваша целевая функция , сумма квадратов расстояний.

Хитрость заключается в вычислении градиента и гессиана для LM.Вы можете сделать это численно, не занимаясь математикой.Используйте численное дифференцирование , чтобы вычислить якобиан (J), который вы используете, чтобы найти градиент.(Якобиан также используется LM для аппроксимации гессиана.)

Матти упомянул GSL для сглаживания сплайнов.Я не знал о GSL, но оказалось, что в нем есть реализации LM и численного дифференцирования.

0 голосов
/ 13 июля 2010

Как насчет сохранения новой точки, только когда вы находитесь на определенном пороговом расстоянии от последней точки?

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