Учитывая изображение, которое имеет только черные и белые пиксели и местоположение (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 за помощь в написании этой задачи! Веселиться!