Para muchos juegos jugados en una grilla, los hexágonos son Clearly Superior Choice ™. Desafortunadamente, muchos sitios de arte de juegos gratuitos solo tienen conjuntos de mosaicos sin costura para mapas cuadrados. En un proyecto anterior, usé algunos de estos y los convertí manualmente en hexágonos.
Sin embargo , me he vuelto perezoso en mi vejez. Debería ser fácil automatizar el proceso con un pequeño script.
Sin embargo , me he vuelto perezoso en mi vejez. Así que te lo estoy subcontratando y disfrazándolo como un desafío de código de golf 1 .
Entrada
La entrada es una imagen cuadrada en cualquier formato de imagen común capaz de color RGB de 24 bits. También puede tomar un nombre de archivo como entrada en lugar de los datos de la imagen en sí.
Puede suponer que la imagen es cuadrada y que la longitud lateral es un múltiplo de cuatro.
Salida
La salida es el mosaico de entrada, pero se convierte en un hexágono (la imagen en sí será cuadrada, con áreas transparentes). Puede guardarlo en un archivo o mostrarlo en la pantalla.
De nuevo, cualquier formato de imagen común servirá. Si el formato que está utilizando admite la transparencia, las áreas de fondo deben ser transparentes. Si no es así, puede usar el color # FF00FF (ese horrible fucsia) como sustituto.
Método
Entonces, ¿Cómo lo hacemos? El método que uso 2 aplasta la imagen un poco verticalmente, pero en general se ve bastante bien para la mayoría de las cosas. Haremos un ejemplo con esta imagen de entrada:
- Escala: escala la imagen a una proporción de 3: 2. Dado que nuestras imágenes serán cuadradas, esto significa que simplemente las escala al 75% de ancho y 50% de altura. Nuestro ejemplo de entrada es 200x200, por lo que terminamos con esta imagen de 150x100:
- Mosaico: coloque copias de su imagen escalada en una cuadrícula de 2x2:
- Recortar: agarra un hexágono del tamaño adecuado desde cualquier lugar de esta cuadrícula de 2x2. Ahora, para facilitar el mosaico, este hexágono no es exactamente regular. Después de recortar un cuadrado del tamaño original (aquí 200x200), recorta las esquinas. Las líneas de recorte deben ir desde (aproximadamente) el centro de cada lado izquierdo / derecho hasta un cuarto desde el borde en la parte superior / inferior:
¡Y esa es tu salida!
Aquí hay un ejemplo de cómo se vería cuando esté en mosaico (alejado aquí):
Este es el código de golf, por lo que gana el código más corto en bytes. Se aplican lagunas estándar, etc., etc.
1 Siéntase libre de creer esto o no.
2 Método uno de este útil sitio.
Respuestas:
Matlab,
223 215 209 184163 bytesEl cambio de escala es bastante sencillo. Para recortar las esquinas, superpongo un sistema de coordenadas sobre los píxeles y hago una máscara a través de cuatro desigualdades lineales, que determinan el área del hexágono.
PD: Esto se convirtió en un juego de codegolf nim con la presentación de @ MartinBüttner: alternativamente, debes hacer tu código más corto (al tiempo que proporcionas la misma funcionalidad), el que puede hacer que el último 'acortamiento' gane =)
fuente
[k.*[2 3]/4]
.Mathematica,
231211209208201188173 bytesEsta es una función sin nombre que toma un objeto de imagen y devuelve un objeto de imagen:
No creo que haya mucho que explicar aquí, pero algunos detalles que son notables:
ImageAssemble[{{#,#},{#,#}}]
decir, tu manoImageAssemble
una matriz 2x2 con copias de la imagen. Sin embargo, hayImageCollage
una especie de función mágica que trata de organizar un montón de imágenes lo más "posible" (lo que sea que eso signifique ... incluso puede darles peso a las imágenes individuales y esas cosas). De todos modos, si le das cuatro imágenes de igual tamaño y con igual (o sin) peso, también las organizará en una cuadrícula de 2x2. Eso me permite guardar algunos bytes para el anidamiento de la matriz, así como el nombre de la función.Graphics
. Estoy usando el incorporadoRegularPolygon@6
, pero impongo una relación de aspecto de1
estirarlo según sea necesario. Desafortunadamente,Graphics
necesita un par de opciones costosas para evitar el relleno y demás, y también se vuelve negro sobre blanco en lugar de lo contrario. El resultado se fija conColorNegate
y luego se adjunta a los canales originales de la imagen conSetAlphaChannel
.Graphics
coloca una pequeña cantidad de relleno alrededor del hexágono, pero queremos que el hexágono alfa cubra el tamaño completo del recorte. Sin embargo,SetAlphaChannel
puede combinar imágenes de diferentes tamaños al centrarlas una encima de la otra y recortarlas al tamaño más pequeño. Eso significa que, en lugar de configurarlo manualmentePlotRangePadding->0
, simplemente podemos escalar un poco la imagen del hexágonoImageSize->1.05e
(y necesitamos la opción `ImageSize de todos modos).fuente
HTML5 + Javascript, 562 bytes
Toma la entrada como una URL de imagen a través de un cuadro de texto (es de esperar que la URL cuente como un nombre de archivo). Emite los datos al lienzo.
Versión que funciona en todos los navegadores (580 bytes):
Pruébelo con la imagen de "bloques" de antes a través de esta URL: http://i.stack.imgur.com/gQAZh.png
fuente
id=A
a<form>
yid=B
al<canvas>
, luego reemplazandol[0]
conA
yl[1]
conB
y eliminandol=document.body.children;
. (Funciona en Firefox 41; no estoy seguro de qué otros navegadores admiten esto). Además, creo que hay un par de puntos y coma innecesarios al lado de las llaves y algunos espacios adicionales.id=C
al<input>
, y luego reemplazare.target.children[0]
conC
.0.75
es igual a3/4
,1/0.75
es igual a4/3
,d/4+d/2
es igual ad*3/4
, y los ceros a la izquierda en los otros decimales no son necesarios. También creo que podría reemplazar el primeroc.drawImage
conc[p="drawImage"]
, luego cada uno conc[p]
; podrías hacer lo mismo conc.lineTo
.Python 2 + PIL, 320
Lee el nombre del archivo de imagen de stdin.
fuente
PIL
que intentarlo y no lo pensé lo suficiente. Sin embargo, todavía mantengo mi declaración de nueva línea: PPHP, 293 bytes
He agregado algunas líneas nuevas para facilitar la lectura:
Aquí está la versión sin golf:
fuente