Я экспериментирую с созданием высокопроизводительных хороших инструментов карандаша с использованием путей SVG.
Я регистрирую координаты мыши для рисования пути. Чтобы получить верный путь (с точностью до движений пользователя), мне нужно записать точку для каждого движения пикселя.
Сохранение каждой точки пути создает огромное количество точек, которые не идеально подходят для совлокальных функций позже (отправка огромного количества точек вперед и назад неэффективна), а также парсинг огромные пути каждый раз, когда мне нужно манипулировать ими, является узким местом
В линейных областях пути удаленные точки удаляются, сохраняя только точки, необходимые для представления сегмента. Я делаю это с помощью Ramer-Douglas-Peucker.
Но упрощение пути превращает его в многоугольник с низкой точностью
В этот момент пути являются фактически просто связанными линиями - поэтому пути выглядят зубчатыми.
Возможное решение состоит в том, чтобы соединить точки пути с Cubic Bezier - однако это не сработает на упрощенных путях. Расстояние между каждой точкой слишком велико, чтобы Cubic Bezier "сидел" хорошо, поэтому сглаженный путь более точно не отображает предполагаемый путь пользователя.
Другим решением является просто использовать алгоритм "пост-обработки", такой как Schneider Algorithm по исходному пути. Этот алгоритм не будет практически работают в режиме реального времени, хотя, поскольку это производительность hog
Идеальное решение
Решение, которое (я думаю) могло бы работать, заключается в использовании интерполяции Centripetal Catmull-Rom.
Из всех изученных алгоритмов это кажется наиболее перспективным, поскольку:
- Он не создает самопересечения на жестких углах.
- Он больше подходит для точек, поэтому он более точно представляет исходный путь.
Является ли Catmull-Rom алгоритмом, который интерполирует ряд регулярные точки x/y или исходный путь должен состоять из Кривые?