Я экспериментирую с созданием высокопроизводительных, красивых карандашных инструментов с использованием путей SVG.
Я регистрирую координаты мыши, чтобы нарисовать путь. Чтобы получить высокоточный путь (с точностью до движений пользователя), мне нужно зарегистрировать точку для каждого движения пикселя.
Сохранение каждой точки на пути создает огромное количество точек, что не идеально подходит для совместной работы в дальнейшем (пересылка большого количества точек туда и обратно неэффективна), а также анализировать огромные пути каждый раз. время, которое мне нужно, чтобы манипулировать ими, является узким местом
На линейных участках пути лишние точки удаляются, оставляя только точки, необходимые для представления сегмента — я делаю это с помощью Рамера-Дугласа-Пекера.
Но упрощение пути превращает его в полигон с низкой точностью.
На данный момент пути представляют собой просто соединенные линии, поэтому пути выглядят неровными.
Возможное решение состоит в том, чтобы соединить точки пути с кубическим Безье, однако это не очень хорошо работает на упрощенных путях. Расстояние между точками слишком велико для того, чтобы кубический Безье мог «сидеть» хорошо, поэтому сглаженный путь больше не точно отражает предполагаемый путь пользователя.
Другое решение — просто использовать алгоритм «постобработки», такой как алгоритм Шнайдера по исходному пути — этот алгоритм практически не будет работать в режиме реального времени, так как он увеличивает производительность.
Идеальное решение
Решение, которое (я думаю) могло бы сработать, — это использовать Centripetal Catmull-Rom< /а> интерполяция.
Из всех алгоритмов, которые я исследовал, этот кажется наиболее многообещающим, поскольку:
- Не создает самопересечений на крутых поворотах
- Он более плотно прилегает к точкам, поэтому более точно представляет исходный путь.
Является ли Catmull-Rom алгоритмом, который интерполирует ряд правильных точек x/y, или исходный путь должен состоять из кривых?