Для многих игр, сыгранных по сетке, шестиугольники - это явно превосходный выбор ™. К сожалению, на многих бесплатных игровых сайтах есть наборы бесшовных плиток для квадратных карт. В прошлом проекте я использовал некоторые из них и вручную преобразовал их в шестиугольники.
Тем не менее , я стал ленивым в старости. Должно быть легко автоматизировать процесс с помощью небольшого сценария.
Тем не менее , я стал ленивым в старости. Так что я передаю его вам и маскирую под кодовый гольф 1 .
вход
Ввод представляет собой квадратное изображение в любом обычном формате изображения, способном к 24-битному цвету RGB. Вы также можете взять имя файла в качестве ввода вместо самих данных изображения.
Вы можете предположить, что изображение квадратное, а длина стороны кратна четырем.
Выход
Выход является входной плиткой, но преобразуется в шестиугольник (само изображение будет квадратным с прозрачными областями). Вы можете сохранить его в файл или отобразить на экране.
Опять же, подойдет любой обычный формат изображения. Если используемый вами формат поддерживает прозрачность, фоновые области должны быть прозрачными. Если это не так, вы можете использовать цвет # FF00FF (этот ужасный фуксия) в качестве замены.
метод
Так как нам это сделать? Метод, который я использую 2, сжимает изображение немного вертикально, но в целом это выглядит довольно хорошо для большинства вещей. Мы сделаем пример с этим входным изображением:
- Масштаб: масштабировать изображение до соотношения 3: 2. Поскольку наши изображения будут квадратными, это означает, что вы просто масштабируете их до ширины 75% и высоты 50%. Наш пример ввода - 200x200, поэтому мы получаем изображение 150x100:
- Плитка: поместите копии вашего масштабированного изображения в сетку 2x2:
- Урожай: возьмите шестиугольник подходящего размера из любой точки сетки 2x2. Теперь, для простоты мозаики, этот шестиугольник не совсем обычный. После обрезки квадрата оригинального размера (здесь 200x200) вы затем обрезаете углы. Линии обрезки должны проходить от (примерно) центра каждой левой / правой стороны до одной четверти от края сверху / снизу:
И это ваш выход!
Вот пример того, как это может выглядеть, когда выложено плиткой (здесь уменьшено):
Это код гольф, поэтому выигрывает самый короткий код в байтах. Применяются стандартные лазейки и тд и тп.
1 Не стесняйтесь верить этому или нет.
2 Способ один из этого полезного сайта.
Ответы:
Matlab,
223 215 209 184163 байтаМасштабирование довольно простое. Для обрезки углов я накладываю систему координат на пиксели и делаю маску с помощью четырех линейных неравенств, которые определяют площадь шестиугольника.
PS: Это превратилось в codegolf NIM игры с @ подачами MartinBüttner: вы чередующимся должны сделать код короче (обеспечивая при этом такой же функциональности) - тот , который может сделать последнюю «укорочение» победу =)
источник
[k.*[2 3]/4]
.Mathematica,
231211209208201188173 байтаЭто безымянная функция, которая берет объект изображения и возвращает объект изображения:
Я не думаю, что здесь есть что объяснить, но некоторые детали, которые заслуживают внимания:
ImageAssemble[{{#,#},{#,#}}]
, то есть выImageAssemble
передаете матрицу 2x2 с копиями изображения. Тем не менее, естьImageCollage
какая-то магическая функция, которая пытается упорядочить кучу картинок настолько «хорошо», насколько это возможно (что бы это ни значило ... вы можете даже дать весы и прочее отдельным изображениям). В любом случае, если вы дадите ему четыре изображения одинакового размера и с одинаковыми (или нет) весами, он также разместит их в сетке 2х2. Это позволяет мне сохранить несколько байтов для вложения матрицы, а также имя функции.Graphics
. Я использую встроенныйRegularPolygon@6
, но применяю соотношение сторон,1
чтобы растянуть его по мере необходимости. К сожалению,Graphics
требуется несколько дорогих опций, чтобы избежать заполнения и тому подобного, и он также отображает черное на белом вместо противоположного. Результат фиксируется с помощью,ColorNegate
а затем присоединяется к исходным каналам изображения с помощьюSetAlphaChannel
.Graphics
помещает небольшое количество отступов вокруг шестиугольника, но мы хотим, чтобы альфа-шестиугольник покрыл весь размер выреза. ОднакоSetAlphaChannel
можно комбинировать изображения разных размеров, центрируя их друг на друга и обрезая до наименьшего размера. Это означает, что вместо ручной настройкиPlotRangePadding->0
мы можем просто немного увеличить изображение шестиугольникаImageSize->1.05e
(и в любом случае нам понадобится опция ImageSize).источник
HTML5 + Javascript, 562 байта
Принимает ввод в виде URL-адреса изображения через текстовое поле (возможно, URL-адрес считается именем файла). Выводит данные на холст.
Версия, которая работает во всех браузерах (580 байт):
Протестируйте его с изображением «блоков», полученным ранее по этому URL: http://i.stack.imgur.com/gQAZh.png
источник
id=A
к<form>
иid=B
к<canvas>
, а затем заменитьl[0]
сA
иl[1]
сB
, и удалениеl=document.body.children;
. (Работает в Firefox 41; не уверен, какие другие браузеры поддерживают это.) Кроме того, я считаю, что есть пара ненужных точек с запятой рядом с правыми фигурными скобками и несколько лишних пробелов.id=C
к<input>
, а затем заменитьe.target.children[0]
наC
.0.75
равно3/4
,1/0.75
равно4/3
,d/4+d/2
равноd*3/4
, и начальные нули на других десятичных числах не нужны. Я также полагаю, что вы могли бы заменить сначалаc.drawImage
наc[p="drawImage"]
, затем на каждый последующийc[p]
; Вы могли бы сделать то же самое сc.lineTo
.Python 2 + PIL, 320
Читает имя файла изображения из стандартного ввода.
источник
PIL
возможности попробовать, и я не думал об этом достаточно. Я до сих порPHP, 293 байта
Я добавил несколько строк для удобства чтения:
Вот негольфированная версия:
источник