Рисование линий с псевдонимом толщиной 1 пиксель в реальном времени

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

Чтобы определить, где пользователь рисует на холсте, отслеживаются координаты мыши. Если удерживать mouse1 нажатой, пиксель, над которым находится курсор, изменится. По сути, он работает так же, как инструмент «Карандаш» в Photoshop.

ПРИМЕЧАНИЕ: алгоритм Брезенхема не работает в этой ситуации. Мои данные отправляются в режиме реального времени, поэтому я не рисую линию от P0 до P1, где расстояние между P0 и P1 составляет много пикселей. В общем, P1 является соседом P0.

Проблема, с которой я столкнулся, заключается в том, что мои результирующие линии не имеют идеально чистого веса в 1 пиксель. Вот пример:

Line comparison

Обратите внимание, что обе линии нарисованы от руки, поэтому есть некоторая разница. Интересно то, что Photoshop может сделать намного более четкое представление линии, которую я рисую, в 1 пиксель. Причина, по которой моя линия выглядит грязнее, заключается в следующем:

Photoshop's line

My line

При рисовании с помощью инструмента в моем приложении красные пиксели заполняются. В Photoshop красные пиксели не заполняются. Это имеет смысл, потому что для перемещения от данного пикселя, скажем, до его юго-восточного соседа, восточный или южный сосед, вероятно, будет пропущен. Существует чрезвычайно малая вероятность того, что курсор пройдет точно за угол в сторону юго-восточного соседа, избегая рисования красного пикселя, но обычно этого не происходит.

Итак, Остается вопрос, как Photoshop может пропустить красные пиксели, которые появляются в моих строках. Единственное, о чем я мог думать, это подождать, пока два пикселя не выстроятся в очередь, прежде чем рисовать любой из них, чтобы я знал, пропущен ли «сосед по углу». В этом случае я бы просто не рисовал первый из двух пикселей, потому что он был бы эквивалентен красному пикселю на моей диаграмме. Это рискует не отрисовать намеченный пиксель, если пользователь рисует пиксель, перемещает курсор на один пиксель на юг, а затем на один пиксель на восток. Оба пикселя должны быть нарисованы, но алгоритм скажет иначе.

Есть идеи? Как Photoshop может решить эту проблему?

12
задан Xenethyl 28 December 2010 в 21:39
поделиться