Рисование псевдонимных, идеальных по пикселям сплайнов размером 1 пиксель (в частности, Catmull-Rom) - PullRequest
8 голосов
/ 27 декабря 2010

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

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

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

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

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

alt text

Который может иметь ожидаемый результат, похожий на этот (примечаниечто это оценка):

alt text

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

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

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

alt text

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

1 Ответ

2 голосов
/ 28 декабря 2010

Здесь у вас есть статья, описывающая метод повторной параметризации сплайнов , чтобы получить одинаково расположенные точки вдоль длины кривой. Я думаю, что это может решить вашу проблему, если вы сможете адаптировать ее к кривым Кэтмулла-Рома (думаю, это не должно быть слишком сложно)

...