Эффективное сглаживание линии (упрощение) - PullRequest
14 голосов
/ 29 апреля 2011

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

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

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

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

Ответы [ 3 ]

10 голосов
/ 29 апреля 2011
6 голосов
/ 01 июня 2012

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

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

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

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

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

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

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

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

2 голосов
/ 28 октября 2014

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

...