Рисование линий

Я немного отстаю на этой неделе! Отдых на прекрасном Вашон-Айленде заставляет меня изо всех сил стараться не отставать от моего обычного графика. Здесь есть чем заняться — фермерский рынок, пляж, походы… много развлечений!

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

Но сначала давайте подведем итоги прошлой недели…

Резюме: Задача № 3

Задачей прошлой недели было написать программу, решающую лабиринты. Жесткий
режим заключался в том, чтобы найти кратчайшее решение лабиринта с несколькими возможными
решениями. И самое крутое: все, кто прислал решение,
прошли сложный режим!

Два особенно подходят для «удиви меня», я думаю:

  1. Решение Йенса Нёмтака было реализовано на Javascript и Node.js (https://github.com/flixo/mazes), и оно также визуально отображает путь через лабиринт!
  2. Мартин Моберг выполнил отправку в Cloure (https://github.com/indifferen7/casual-m) и также визуально отображает пути.

Другие материалы в сложном режиме:

  1. Лассе Эберт выбрал Эликсир: https://github.com/lasseebert/jamis_challenge/tree/master/003_maze
  2. Стив Десмонд написал на C#: https://github.com/stevedesmond-ca/WeeklyChallenges/tree/master/03-Maze.
  3. Алехандро Переа реализовал его на Javascript: https://github.com/aeperea/programming-challenges/tree/master/03-mazes

Я впервые попробовал это в Эликсире и был приятно удивлен, что смог достаточно обдумать это, чтобы преуспеть в сложном режиме! Вы можете увидеть мою заявку здесь: https://github.com/jamis/weekly-challenges/tree/master/003-maze-solver

А теперь приступим к задаче №4!

Задание по программированию №4

Для этого задания вам не разрешается использовать какую-либо графику или библиотеку изображений. Никто! Короче говоря, вы будете представлять изображение как необработанную матрицу значений пикселей RGB, которую вы будете рисовать с помощью минимального API вашего собственного изобретения. Когда вы закончите рисовать, вы запишете его в файл в формате PPM.

Давайте разберем это.

Во-первых, необработанные данные изображения. Вы должны представить изображение в виде массива (как минимум) значений RGB, где каждый цвет имеет размер (как минимум) 8 бит. То есть каждый пиксель будет представлять собой три числа: красный (0–255), зеленый (0–255) и синий (0–255). Если вы хотите поддерживать альфа-канал, это тоже нормально. Ваш API изображений должен поддерживать только один метод «отрисовать пиксель», чтобы записать пиксель заданного цвета в заданную координату (x,y). (Больше методов — это хорошо, если вы хотите сойти с ума — но вам нужно поддерживать только один метод.)

Во-вторых, рисование! Это самое интересное. Вы сможете реализовать алгоритм линии Брезенхема (что должно быть очень, очень просто, потому что для него есть псевдокод по всему Интернету). Вы должны разрешить произвольные линии с произвольными начальными и конечными точками и произвольными цветами.

В-третьих, запишите его как файл PPM. Вы можете использовать либо формат ASCII (P3), либо двоичный формат (P6). (Если у вас возникли проблемы с поиском приложения, которое может просматривать файлы PPM, вы можете использовать такой инструмент, как ImageMagick, для преобразования выходных данных в PNG или что вам угодно.)

Вот и все! Если вы сделаете именно это, вы получите подачу в «нормальном режиме». Тогда для сложного режима… Давайте попробуем на этот раз что-то немного другое.

оценка

Нормальный режим, как было сказано ранее, это три вещи:

  • Простой API изображений, отрисовывающий цвет RGB по заданной координате
  • Алгоритм линии Брезенхэма
  • Сохранить изображение как файл PPM (в формате P3 или P6)

Мы назовем это основой и дадим вам один балл за эти три вещи вместе. За каждый из следующих вариантов вы получите еще один балл:

  • Толстые линии. Разрешите трассировке чертежа принимать параметр «ширина линии».
  • Стили линий (по крайней мере пунктирные и пунктирные, но не стесняйтесь экспериментировать!)
  • Сглаженные линии! Внедрить линейный алгоритм Сяолиня Ву вместо алгоритма Брезенхэма.
  • В дополнение к линиям также реализуйте алгоритм средней окружности.
  • Если алгоритм круга в средней точке недостаточно сложен, адаптируйте его для рисования дуг (сегментов круга)! Вы должны указать либо (а) начальную точку, конечную точку и радиус, либо (б) начало координат, начальный угол и конечный угол.
  • Каждый дополнительный формат файла, который вы поддерживаете для сохранения изображения, приносит вам еще один балл. Обратите внимание, что вы должны написать процедуры для форматирования изображения самостоятельно!

А если вы действительно хотите проявить творческий подход, выберите режим удиви меня! Это не обязательно должно быть ужасно сложно, но это должно быть нечто большее, чем основы, применяемые неожиданным или вдумчивым образом. Посмотрите, что вы можете придумать!

Это испытание продлится до субботы, 27 августа, 12:00 MDT (18:00 UTC).

Прием заявок на участие в этом испытании закрыт, но вы все равно можете попробовать свои силы! Если вы следите за новостями, задача следующей недели — Приоритетные очереди и бинарные кучи. Увидимся там!