Как стать автором
Поиск
Написать публикацию
Обновить

Комментарии 43

Странно. Последнее изображение противоречит тексту. Написано, что чем ближе линия к середине пикселя, но при этом 2 пикселя ровно посередине (координаты 2:1 и 3:1) явно светлее своих «пар» (2:0 и 3:2 соответственно), хотя их центры и находятся гораздо ближе к линии
Простите за занудство. Но мне потребовалось 4 раза перечитать предложение, чтобы понять о чем вы. Так правильнее:

Написано, что чем ближе линия к середине пикселя, тем темнее, но при этом 2 пикселя ровно посередине (координаты 2:1 и 3:1) явно светлее своих «пар» (2:0 и 3:2 соответственно), хотя их центры и находятся гораздо ближе к линии
да-да, извиняюсь, заметил уже тогда, когда редактировать поздно было…
Опечатка в тексте, сейчас исправлю.
Это не опечатка, нужно переделывать картинку.
А, разобрался в чём дело. Я в графическом редакторе вырезал не тот кусок линии.
Переделал иллюстрации. Морока с этим фотошопом пиксели увеличивать, всё норовит сгладить.
Я обычно это принтскрином делаю, не всегда подходит, но в целом быстро и просто.
Увеличивайте с интерполяцией по соседним пикселям (Nearest neighbor).
Линия пересекает боковые центры этих пикселей (нижний и верхний), а не центр пикселя (геометрический).
раньше там было другое, неправильное, изображение
В прекрасном университете ИТМО лабораторная по компьютерной графике писалась на ASM, а задание было нарисовать свою фамилию начертанием «от руки». Все, кто хотят вызубрить эти алгоритмы — Welcome to IFMO!:)

Не для слабонервных
По-моему, тут нет сглаживания.
Так монохромная картинка же. Раз на ASM-е делалось, явно проще в двух цветах работать, чем загружать свою палитру, например.
Про самую первую картинку: мне на 100% нравится вариант слева — глаза не устают.
Ничего удивительного, алгоритм У Сяолиня для рисования гладких линий за двадцать с лишним лет успел устареть. На замену ему напридумывали множество других алгоритмов, в том же фотошопе линии рисуются иначе, зато он по-прежнему остаётся очень простым в реализации.
Сейчас происходит дополнительно утяжеление линии, для того, чтобы она не выглядела резаной. Утяжеление расширяет количество смежных пикселей на некоторое значение, которое сглаживает линию.
Жуть, Брезенхем с плавающей точкой, извращение. Это целочисленный алгоритм, на кой черт там float. В той же вики есть пример на C++, целочисленный.
Разумеется, но приведённый выше читается легче. Во время подготовки статьи я нашёл море разных оптимизаций, но не могу же я их все привести?
Один из бонусов алгоритма Брензенхема состоит в том, что он целочисленный. Я понимаю, что сейчас это уже не актуально, но печально глядеть на то, как люди коверкают сущности.
Это все еще актуально. см мою недавнюю историю.
Всегда можно найти задачу где применение целочисленной арифметики оправданно. Просто раньше их и искать не надо было.
В статье не указанно, в чём преимущество алгороитма Брезенхема. А именно: в цикле рисования не используется умножение и деление, что было очень актуально, когда процессоры были большие и медленые.
Оно и сейчас актуально.
Спасибо за алгоритм сглаженной линии. Брезенхем для сеток давно использовал уже. Не хватает примеров в 100% масштабе. По увеличенным понятно, как оно должно выглядеть, но, иногда, в 100% масштабе выглядит все не так, как представляется.
Посмотрите на новые картинки, надеюсь, стало понятнее.
(y1 — у0)/(x1 — x0)

А если x1=x0?
Тогда деление на ноль. Кроме вертикальной линии, есть ещё три других особых ситуаций: горизонтальная линия, диагональ под 45 градусов и точка. Их можно обрабатывать в начале и рисовать другими способами.
Ошибся, memset — для горизонтальной. Для вертикальной — только цикл.
А для диагональной — тот же цикл, но со сдвигом на 1 в обоих измерениях, а не в одном.
А потом можно прогнать тот же цикл около линии с каждой стороны и на 2 пикселя короче с прозрачностью, скажем, 1-sqrt(2), для сглаживания.
(1-sqrt(2))/2 даже, наверно, потому что с двух сторон.
То есть (1-sqrt(2)/2)/2, забыл поделить корень на 2.
Нужно наверное еще гамму учитывать — код цвета пикселя вроде как нелинейно связан с его яркостью. Линии будут менять визуально толщину в зависимости от наклона.

Кроме того, по этому алгоритму концы отрезка получаются неправильные — скошенные по вертикали. Через это непонятно что будет на стыках двух отрезков.

Короче я бы все-таки взял какую-нибудь готовую библиотеку для рисования вектора, нетривиальная это задача.
Если вы не из параллельной вселенной, где все сидят за векторными мониторами

Я из параллельной вселенной, где на векторные гипертекстовые мониторы выводятся (исключительно ради обратной совместимости!) эти ваши растровые изображения — в виде совокупности закрашенных квадратных фигур со сторонами, параллельными краям монитора.

Бррр. Расточительный расход экранной площади.
в виде совокупности закрашенных квадратных фигур со сторонами, параллельными краям монитора

Это и есть растр.
вот-вот. И больше ничего из него не извлечешь.

Хоть векторизуй, в самом деле.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Да вы, батенька, весельчак!
Поглядите на эту полоску: /. Если придвинуться поближе к монитору, то можно увидеть пиксельные ступеньки, которые пытаются притвориться векторной линией.

Те у кого ретина, разглядеть не смогут как ни придвигайся. ))
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации