Учитывая изображение, которое имеет только черные и белые пиксели и местоположение (x, y), которое является белым пикселем, раскрасьте белые пиксели на основе их минимального Манхэттенского расстояния от (x, y) в пути, который включает в себя только прохождение других белых пикселей.
Оттенок из цветных пикселей должен быть пропорционален расстоянию от (х, у), так что пиксель в точке (х, у) будет иметь цветовой тон от 0 ° (чистого красного цвета) и пиксели , наиболее удаленных от (х, у) будет иметь оттенок 360 ° (также красный), а другие оттенки будут плавно и линейно смешиваться между ними. Насыщенность и значение оба должны быть 100%.
Если белый пиксель не подключен к (x, y) через другие белые пиксели, он должен оставаться белым.
подробности
- Входные данные будут состоять из имени файла изображения или необработанных данных изображения, а также целых чисел x и y.
- Выходное изображение может быть сохранено в файл или передано в необработанном виде в стандартный формат файла изображения или просто отображено.
- Значение x равно 0 в крайнем левом пикселе и увеличивается при движении вправо. Значение y равно 0 в верхних пикселях и увеличивается при спуске. (x, y) всегда будет в границах изображения.
- Разрешены как полные программы, так и функции.
Самый короткий код в байтах побеждает.
Примеры
Все эти изображения были уменьшены для экономии места. Нажмите на них, чтобы просмотреть в полном размере.
Входное изображение:
(x,y) = (165,155)
а также (x,y) = (0,0)
Введите изображение и выведите с помощью (x,y) = (0,0)
:
Введите изображение и выведите с помощью (x,y) = (600,350)
:
Введите изображение и выведите с помощью (x,y) = (0,0)
:
Введите изображение и выведите с помощью (x,y) = (0,0)
:
Дополнительный бонус -30%: используйте евклидово расстояние. Предложение для вашего алгоритма следующее (общий план):
- Есть стартовый пиксель.
- Заполните поток от этого пикселя.
- Для каждого пикселя, достигнутого в заливке,
- Переходите от начального пикселя к этому пикселю с шагом в половину единицы по прямой линии.
- На каждом шаге применяйте
int()
координаты x и y. Если пиксель в этих координатах черный, остановитесь. В противном случае продолжайте. (Это метод прямой видимости.) - Любой достигнутый пиксель, который граничит с белым пикселем и / или пикселем, который ранее был помечен на значительно большем расстоянии (т.е. +10), становится стартовым пикселем.
В более мета-смысле, этот алгоритм распространяется на каждый пиксель, доступный по прямой линии от начальных / уже окрашенных пикселей, а затем «дюймов» вокруг краев. Бит «значительно большее расстояние» предназначен для ускорения алгоритма. Честно говоря, неважно, как вы реализуете евклидово расстояние, просто это должно выглядеть примерно так.
Вот как выглядит первый пример с евклидовым расстоянием, используя алгоритм выше:
Введите изображение и (x,y) = (165,155)
Большое спасибо Calvin'sHobbies и trichoplax за помощь в написании этой задачи! Веселиться!
источник
Ответы:
Matlab,
255 245231 байтЭто ожидает имя изображения сначала, потом
y
и потомx
.Я реализовал заливку (или, если хотите, «dijkstra для 4-окрестностей»), сначала создав маску, в которой начальный пиксель установлен в 1, с накопителем расстояния (оба размера изображения), а затем повторив следующее шаги:
k
k
Это оставляет нам манхэттенские расстояния каждого пикселя до начального пикселя в аккумуляторе расстояний. Затем мы создаем новое изображение, проходя через заданный диапазон цветов и сопоставляя «первый» оттенок с нулевым значением, а «последний» - с максимальным расстоянием.
Примеры
В качестве бонуса, здесь красивая картинка того, как рассчитывается расстояние. ярче = дальше.
источник
Blitz 2D / 3D , 3068 * 0,7 = 2147,6
Это эталонная реализация для евклидова алгоритма гольфа.
На самом деле, я ненавижу, как это нечитаемо по сравнению с оригиналом. (Между прочим, это 5305 байт.) На самом деле, я мог бы выделить еще несколько байтов, используя однозначные имена переменных для всего, но это уже довольно смешно. И это не победит в ближайшее время. :П
источник
C ++ / SFML:
127112351226 байт-36 байт благодаря пользователю 202729 -9 байт благодаря Zacharý
sf::Image
Параметр также выходной сигнал (будет изменено). Вы можете использовать это так:Первый параметр является входным изображение (и выход), вторые и третьи параметрами являются
x
иy
параметром , где он должен начатьисточник
setPixel(j, i,hsv2
иFI(xm,ym) (std::find_if
действительно ли это необходимо?G(d,a,b,c)
иcase d:
. Кроме того, пространство междуcase d:
иreturn C(a,b,c)
не требуется, а также.(b>m?b:m)
не требует скобок, а(t/60)%6
=>t/60%6
по порядку операций.xm
иym
сократить имена переменныхG(d,a,b,c)
иcase
,FI
,ti
, иhsv2rgb
каждый может быть заменен более коротким именем.C ++,
979 969 898 859848 байтRGBARGB (выводится в файл: d)Не совсем прямой "ungolf", но это был прототип C, который я сначала смоделировал:
Многие концепции остаются схожими, но, несомненно, существует множество мелких изменений. Чтобы скомпилировать это как C, вам нужно использовать C11 (C99, вероятно, будет работать, но я только строго протестировал в C11).
Мне очень понравился этот вызов, спасибо, что дали мне идею попробовать что-то новое :).
Изменить: Гольф немного лучше.
Edit2: объединены две структуры, так что моя структура пикселей и очередь одинаковы, немного больше злоупотреблений макросами, и переформатировано использование 255, так что его можно определить как -1 при определении серии неподписанных символов, и, наконец, удалил вызов функции.
Edit3: повторно использовали еще несколько переменных, настройки приоритета оператора и преобразованный вывод в RGB, сохраняя альфа-канал.
Edit4: я думаю, что с этим я покончил, некоторые арифметические изменения указателя и небольшие изменения потока управления.
источник
Python 3 и matplotlib, 251 байт
В качестве входного значения используется массив nxy MxNx3, возвращаемый функцией matplotlib
imshow()
. Входные данные изменяются функцией, поэтому они должны быть скопированы заранее. Изображение отображается автоматически, если matplotlib находится в «интерактивном» режиме; в противном случае вызовshow()
должен быть добавлен еще на 7 байтов.Вывод создается путем отображения исходного изображения, а затем отображения изображения радуги поверх него. Matplotlib удобно обрабатывать inf и nan как прозрачные, так что черно-белое изображение просвечивает.
источник