Краткая информация: я работаю над веб-приложением рисования, и один из инструментов, которые я реализую, представляет собой карандаш толщиной в 1 пиксель. Инструмент позволяет пользователю нарисовать линии на 1 пиксель с псевдонимом на холсте.
Чтобы определить, где пользователь рисует на холсте, отслеживаются координаты мыши. Если мышь удерживается нажатой, пиксель, над которым будет курсор, изменится. По сути, он работает так же, как инструмент карандаша в Photoshop.
ПРИМЕЧАНИЕ. Алгоритм Брешенема не будет работать для этой ситуации. Мой ввод представлен в режиме реального времени, поэтому я не рисую строку от P0 до P1, где расстояние между P0 и P1 составляет много пикселей. В общем случае P1 является соседом P0.
Проблема в том, что мои результирующие строки не имеют абсолютно чистого веса 1px. Вот пример:
Обратите внимание, что обе линии рисованы вручную, поэтому существует некоторая дисперсия. Интересно то, что Photoshop может сделать намного более чистое 1px представление строки, которую я рисую. Причина, по которой моя линия выглядит более грязной, заключается в следующем:
При рисовании с помощью инструмента в моем приложении заполняются красные пиксели. В Photoshop красные пиксели не заполняются. Это имеет смысл, потому что для перехода от заданного пикселя к, скажем, к юго-востоку сосед, или восточный или южный сосед, скорее всего, пройдут. Существует очень тонкий шанс, что курсор пройдет точно за угол в юго-восточном соседе, избегая рисования красного пикселя, но этого обычно не происходит.
Итак, вопрос, который мне оставил, заключается в том, как Photoshop может пропускать красные пиксели, которые появляются в моих линиях. Единственное, о чем я мог думать, это ждать, пока два пикселя не будут поставлены в очередь, прежде чем рисовать любой из них, чтобы я знал, прошел ли "сосед". В этом случае я бы просто не рисовал первый из двух пикселей, потому что он был бы эквивалентен красному пикселю на моей диаграмме. Это рискует не рисовать намеченный пиксель, если пользователь рисует пиксель, перемещает курсор на один пиксель на юг, а затем на один пиксель на восток. Оба пикселя должны быть нарисованы, но алгоритм сказал бы иначе.
Любые идеи? Как Photoshop может решить эту проблему?