Эффективное сглаживание линий и / или упрощение

#vector #paint #computational-geometry #bezier #vector-graphics

#вектор #Краски #вычислительная геометрия #безье #векторная графика

Вопрос:

Я создаю приложение для рисования на Actionscript (хотя мой вопрос не связан с Actionscript). Основная идея заключается в том, чтобы начинать рисовать при нажатии мыши и отслеживать движения мыши. Чего я хочу достичь, так это:

  1. уменьшить «шум» мыши и
  2. создавайте более плавные линии.

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

Есть ли лучшие подходы?

Ответ №1:

Смотрите Эффективную подгонку кривой Сары Фрискен. Также доступно на странице автора.

Комментарии:

1. кажется, что первая ссылка, которую вы предоставляете, не работает. есть другие ссылки на это?

2. @Aneem, видишь dx.doi.org/10.1080/2151237X.2008.10129260 и sarahfrisken.com/efficientCurveFitting.pdf .

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

4. Разве это не запатентовано лабораториями Mitsubishi?

Ответ №2:

У Майка Бостока здесь есть несколько хороших примеров упрощения строк. Он указывает, что алгоритм Дугласа-Пекера хорошо известен. Однако Visvalingam представляется более эффективным.

Ответ №3:

(наткнулся на ваш вопрос, когда искал такой же, и случайно собрал что-то свое)

http://willowsystems.github.com/jSignature/#/about/linesmoothing/

(Ссылка, совместимая с SEO, на то же самое:http://willowsystems.github.com/jSignature/%23%2Fabout%2Flinesmoothing%2F.html )

Проблема, которую вы описываете, двоякая. 1. Вы хотите «упростить» данные захвата. 2. Вы хотите нарисовать красивую линию («вписать кривую») внутри точек.

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

Смотрите ссылку выше для объяснения одного (нашего) подхода к подгонке (Безье, иначе «кубических») кривых между точками. Это позволяет вам сохранить линию, нарисованную пользователем, и просто задержаться на соединении последних 2 координат, или вы можете упростить и перерисовать всю линию таким образом.

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

Демонстрационная ссылка использует пропуск на 4 пикселя при движении мыши. Это грубо, но подходит для «упрощения» данных в реальном времени. Если у вас есть роскошь захватить весь штрих и перерисовать все это, конечно, используйте simplify.js .

Комментарии:

1. У вас есть чистый пример рассматриваемого алгоритма? Что-то, что можно вызвать для 4 точек и вернуть подобранный безье?