Рисование сплайнов размером 1 пиксель с псевдонимом и пикселями (в частности, Catmull-Rom)

Краткая предыстория: Я ' m работает над веб-приложением для рисования, и мне нужно нарисовать сплайны толщиной 1 пиксель, проходящие через их контрольные точки.

Проблема, с которой я борюсь, заключается в том, что мне нужно рисовать каждый из пикселей между p1 и p2, как если бы я использовали инструмент карандаша 1px. Итак, без сглаживания и по одному пикселю за раз. Это нужно делать вручную без использования какого-либо кода библиотеки линий / кривых, поскольку моя система кистей зависит от наличия пиксельной координаты для нанесения кончика кисти на холст.

По сути, мне нужно объединить шаг в один пиксель от чего-то как алгоритм Брезенхема с координатами, возвращаемыми уравнением Катмалла-Рома. У меня проблемы, потому что точки Катмулла-Рома распределены неравномерно (поэтому я не могу просто сказать, что на кривой должно быть 100 пикселей, и запустить уравнение 100 раз). Я попытался использовать расчетное начальное значение максимума дельт X и Y и заполнить пробелы с помощью Брезенхема, но из-за округления я все еще получаю некоторые «грязные» участки (т.е. линия явно движется вверх и к верно, но я все еще получаю два пикселя с тем же компонентом Y, что приводит к «толстому» участку линии).

Я уверен, что это было решено, потому что почти каждая графическая программа, которая рисует сплайны, должна поддерживать чистый пиксель кривые, которые мне нужны. Однако после небольшого математического исследования я немного запутался и все еще не нашел решения. Есть какой-нибудь совет?

РЕДАКТИРОВАТЬ: Вот пример кривой, которую мне, возможно, придется визуализировать:

alt text

Ожидаемый результат может выглядеть следующим образом (обратите внимание, что это оценка):

alt text

Использование Catmull-Rom сплайновое уравнение, нам нужно четыре точки для создания сегмента. P0 и P3 используются как касательные для входящего и исходящего направления от сегмента P1-> P2. В сплайне Катмулла-Рома синяя секция - это все, что интерполируется, когда t перемещается от 0 до 1. P0 и P3 могут быть дублированы, чтобы обеспечить визуализацию зеленой части, так что это не проблема для меня.

Для простоты мне нужно визуализировать пиксели на кривой между P1 и P2, учитывая, что у меня есть касательные в форме P0 и P3. Мне не обязательно использовать шлицы Катмулла-Рома, но они кажутся правильным инструментом для этой работы, так как контрольные точки должны быть пропущены через них. Неравномерное распределение точек интерполяции - вот что заставляет меня зацикливаться.

EDIT2: Вот пример того, что я имею в виду, когда говорю, что моя результирующая кривая грязная:

alt text

Красные стрелки указывают несколько мест, где не должно быть пикселя. Это происходит потому, что компоненты X и Y координаты, которые вычисляются, не изменяются с одинаковой скоростью. Итак, когда каждый из компонентов округляется (так что у меня есть точное местоположение пикселя), может случиться так, что либо X, либо Y не будут увеличены, потому что вычисленная координата, скажем, (42.4999, 50.98). Замена раунда на пол или потолок не решает проблему, просто меняется место, где она возникает.

8
задан Xenethyl 28 December 2010 в 00:40
поделиться