Краткая предыстория: я работаю над веб-приложением для рисования, и мне нужно нарисовать сплайны толщиной 1 пиксель, проходящие через их контрольные точки.
Проблема, с которой я борюсь, заключается в том, что мне нужно нарисовать каждый пиксель между p1 и p2, как если бы я использовал инструмент карандаша 1px. Итак, без сглаживания и по одному пикселю за раз. Это нужно делать вручную без использования какого-либо кода библиотеки линий / кривых, поскольку моя система кистей зависит от наличия пиксельной координаты для нанесения кончика кисти на холст.
По сути, мне нужно объединить шаг на один пиксель из чего-то вроде алгоритма Брезенхема с координатами, возвращаемыми уравнением Катмалла-Рома. У меня проблемы, потому что точки Катмулла-Рома распределены неравномерно (поэтому я не могу просто сказать, что на кривой должно быть 100 пикселей, и запустить уравнение 100 раз). Я попытался использовать приблизительное начальное значение максимума дельт X и Y и заполнить пробелы с помощью Брезенхэма, но из-за округления я все еще получаю некоторые «грязные» участки (т.е. линия явно движется вверх и в сторону верно, но я все равно получаю два пикселя с одним и тем же компонентом Y, что приводит к «толстому» участку линии).
Я уверен, что это было решено, потому что почти каждая графическая программа, которая рисует сплайны, должна поддерживать чистые пиксельные кривые, которые мне нужны. Однако после небольшого математического исследования я немного сбит с толку и все еще не нашел решения. Любой совет?
РЕДАКТИРОВАТЬ: Вот пример кривой, которую мне, возможно, придется визуализировать:
Ожидаемый результат может выглядеть так (обратите внимание, что это оценка):
Используя уравнение сплайна Катмулла-Рома, нам нужно четыре точки для создания сегмента. P0 и P3 используются как касательные для входящего и исходящего направления от сегмента P1-> P2. В сплайне Катмулла-Рома синяя часть - это все, что интерполируется, когда t перемещается от 0 до 1. P0 и P3 могут дублироваться, чтобы обеспечить визуализацию зеленой части, так что для меня это не проблема.
Для простоты мне нужно отрендерить пиксели на кривой между P1 и P2, учитывая, что у меня есть касательные в форме P0 и P3. Мне не обязательно использовать шлицы Катмулла-Рома, но они кажутся правильным инструментом для этой работы, так как контрольные точки должны быть пропущены через них. Неравномерное распределение точек интерполяции - вот что меня зациклило.
EDIT2: Вот пример того, что я имею в виду, когда говорю, что моя результирующая кривая грязная:
Красные стрелки указывают несколько мест, где не должно быть пикселя. Это происходит из-за того, что вычисляемые компоненты X и Y координаты не изменяются с одинаковой скоростью. Итак, когда каждый из компонентов округляется (так что у меня есть точное местоположение пикселя), может случиться так, что либо X, либо Y не будут увеличены, потому что вычисленная координата, скажем, (42.4999, 50.98). Замена раунда на пол или потолок не решает проблему, просто меняется место, где она возникает.