Напишите программу или функцию, которая принимает следующие данные в приемлемом формате по вашему выбору:
Два натуральных числа W и H, которые определяют ширину и высоту изображения, которое вы будете генерировать.
Два цвета RGB C1 и C2, которые будут использоваться для окрашивания изображения.
Список из трех кортежей формы,
(r, x, y)
которые определяют круги с радиусомr
и центромx, y
в плоскости изображения.r
является положительным целым числом иx
иy
являются любыми целыми числами. Верхний левый пиксель изображения - это,0, 0
а ось x увеличивается вправо, а ось y увеличивается вниз.
Выведите изображение с размерами W по H, которое раскрашено C1 и C2 так , чтобы никакие две соседние области, определенные всеми перекрывающимися кругами, не были одного цвета.
Например: если ввод
W = 300 H = 200 C1 = (255, 200, 0) C2 = (128, 0, 255) Circles = (25, 50, 80), (40, 80, 120), (300, -100, 6), (17, 253, 162)
тогда границы круга выглядят так:
В изображении, созданном кругами, есть шесть отдельных смежных областей. Каждый регион должен быть окрашен в C1 (желтый) или C2 (фиолетовый) так, чтобы никакие два соседних региона не были одинакового цвета.
Есть два способа сделать это, их единственное отличие состоит в том, что цвета меняются местами:
Таким образом, любое из этих двух изображений будет правильным выводом для примера ввода.
Что - то вроде этого будет недействительным выходом , так как два желтых областей граничат друг с другом.
Ваши выходные изображения должны следовать этим рекомендациям:
Помимо C1 и C2, третий, нейтральный цвет, такой как черный или белый, может использоваться для границ круга, если они имеют толщину не более 5 пикселей. (Черные границы толщиной в 1 пиксель присутствуют в приведенном выше примере.)
Однако границы кругов не обязательны. Регионы могут соседствовать друг с другом напрямую:
И то, и другое является еще одним допустимым выходом для примера выше.
Круги должны быть настолько точными, насколько это возможно, используя алгоритмы рисования кругов или все, что предоставляет ваша графическая библиотека.
В общем, пиксельное совершенство не требуется, но если входные параметры масштабируются одинаково все больше и больше, результирующее изображение должно становиться все более и более точным.
Сглаживание разрешено, но не обязательно.
Линии сетки или метки осей и т. Д. На заднем плане не допускаются.
Самый короткий код в байтах побеждает.
Больше примеров
Все используют эти входы с различными наборами кругов:
W = 100
H = 60
C1 = (255, 0, 0)
C2 = (0, 0, 255)
В любом примере цвета можно поменять местами и оставить их действительными.
Circles =
A. empty list
B. (13, 16, 20)
C. (30, 16, 20)
D. (200, 16, 20)
E. (42, 50, 20)
F. (42, 50, 20), (17, 40, 30)
G. (42, 50, 20), (17, 20, 30)
H. (42, 50, 20), (17, 10, 30), (10, 50, 30)
I. (42, 50, 20), (17, 10, 30), (35, 50, 20)
J. (18, 36, 40), (18, 63, 40), (18, 50, 20)
K. (100, -10, -20), (60, 50, -10)
L. (18, 36, 40), (18, 63, 40), (18, 50, 20), (14, 50, 20), (5, 50, 18), (20, 0, 0), (70, 22, 0), (10000, -9970, 0), (135, 100, -80)
A.
B.
C.
D.
E.
F.
G.
H.
I.
J.
K.
L.
Убедитесь, что ваш вывод ведет себя подобно всем этим примерам.
источник
tikz
Ответы:
Mathematica, 165 байт
Чистая функция, принимающая четыре аргумента: ширина, высота (оба целых числа), упорядоченная пара троек чисел от 0 до 1 (представляющих два цвета RGB) и список элементов в форме
{r, {x, y}}
для записи радиусов и центров круги. Например, первый пример в OP будет вызван с аргументами[300, 200, {{1, 0.784, 0}, {0.5, 0, 1}}, {{25, {50, 80}}, {40, {80, 120}}, {300, {-100, 6}}, {17, {253, 162}}}]
. Положительная ось Y указывает вверх в Mathematica.Norm[{x,y}-#2]<#
определяет, находится ли точка внутри данного круга;Boole[...]Pi
преобразует этоTrue
илиFalse
вπ
или0
. После вычисления этих πs / 0s по всем входным кружкамTr
складывает их иCos
преобразует четные кратные от π до 1, нечетные кратные от π до –1.ContourPlot[...,Contours->{0}]
затем окрашивает соответствующую область плоскости в два цвета в зависимости от того, больше или меньше значение0
.AspectRatio->Automatic
делает круги похожими на круги;PlotPoints->5!
дает приличную точность (повысите ее,9!
если вы действительно хотите удивительную картинку, далеко в будущем!);Frame->False
избавляется от осей; иContourShading->RGBColor@@@#3
использует входные цвета для контуров.Пример вывода с первой парой цветов (поскольку они хороши), но с последним набором кругов:
источник
JavaScript / SVG / HTML5, 219 байт
источник
BBC Basic,
120117 байтСкачать переводчик можно по адресу http://www.bbcbasic.co.uk/bbcwin/bbcwin.html.
BBC Basic имеет ряд цветовых режимов, позволяющих строить растровую графику в соответствии с базовыми логическими операциями: OR, AND, XOR и т. Д.
Он также поддерживает перепрограммирование паллет, что означает, что, например, здесь двухцветное изображение может быть перепрограммировано в любой из 4096 цветов. Используемая здесь реализация имеет некоторые (недокументированные) отличия от исходной реализации BBC, в которых операторы EOR не потребуются.
Ungolfed
Типичный выходной экран
Пример изображения, увеличенного в 10 раз в единицах / в 5 раз в пикселях (BBC basic использует 1 пиксель = 2 единицы).
источник
MATL ,
302925 байтФормат ввода:
Попробуйте в MATL Online! Или проверьте последний контрольный пример . (Интерпретатор все еще экспериментальный. Возможно, вам придется обновить страницу и повторить попытку, если она не работает).
объяснение
Код использует комплексные числа для определения сетки точек и для вычисления расстояний, а также интенсивно использует операции с массивами при широковещании .
источник
Python с использованием pypng ,
140138 байтПример использования:
Спасибо xnor за сохранение 2 байта.
источник
abs(x-X+1j*(y-Y))<r
.Математика (неконкурентная)
(не знаю, как сделать LaTeX в PPCG, поэтому я использовал инструмент LaTeX для png)
объяснение
Произведение уравнений многократного круга (
(x-a)^2+(y-b)^2-r^2
)> = 0 создаст график, в котором нуждается этот вопрос. В уравнении,n
является размер массива, а(x, y or r)_k
этоk
й(x, y, or r)
элемент.пример
(0,0,2),(2,2,2)
(Неравенство сюжета от WolframAlpha)
Уравнение Get / Run для WolframAlpha
Показать фрагмент кода
Теперь заставьте это работать с Mathematica ...
источник
Python 2.x,
166158Функция генерирует файл PPM на стандартном выходе.
пример:
источник
Common Lisp + Quicklisp + ZPNG 260 + 20 = 280 символов
Это один из самых широких кодов, которые я когда-либо писал на CL, и если бы я не занимался гольфом кода, я бы реструктурировал его, чтобы его было легче читать ...
Прелюдия (20 символов)
Гольф (260 символов)
Ungolfed:
(Использует defun для проверки и более длинные имена переменных для удобства чтения)
Пример использования:
Explaination
Возвращает true, если точка (i, j) попадает в данную окружность круга. Евклидово расстояние вычисляется путем взятия абсолютного значения комплексного числа, которое представляет вектор от (i, j) до центра окружности.
Отобразите эту функцию по списку окружностей и проверьте, попадает ли заданная точка (i, j) в четное число окружностей.
Выберите цвет на основе этого теста.
Соберите воедино плоский список всех байтов rgb, зацикливая каждый (i, j) на изображении и добавляя полученные списки вместе.
Преобразуйте этот список байтов в правильный массив байтов, чтобы zpng мог его правильно принять.
Создайте объект png.
Создайте функцию, которая будет принимать ширину, высоту, два цвета и список окружностей и возвращать созданный объект png.
источник
JavaScript (ES6), 224 байта
Я видел решение JS + SVG, но мне просто нужно было создать решение на основе холста ;-) Это функция, которая возвращает элемент холста. Если можно предоставить существующий элемент canvas, удалите 40 байт.
Звоните как
f(width, height, [[r1, g1, b1], [r2, g2, b2]], [[r1, x1, y1], [r2, x2, y2], ...])
Пример вывода:
источник
Löve2D , 353 байта.
источник