Para muitos jogos disputados em uma grade, os hexágonos são a Claramente Superior Choice ™. Infelizmente, muitos sites de arte de jogos gratuitos possuem apenas conjuntos de blocos sem costura para mapas quadrados. Em um projeto passado, usei alguns deles e os converti manualmente em hexágonos.
No entanto , fiquei preguiçoso na velhice. Deve ser fácil automatizar o processo com um pequeno script.
No entanto , fiquei preguiçoso na velhice. Portanto, estou terceirizando para você e disfarçando-o como um desafio de código de golfe 1 .
Entrada
A entrada é uma imagem quadrada em qualquer formato de imagem comum capaz de cores RGB de 24 bits. Você também pode usar um nome de arquivo como entrada em vez dos próprios dados da imagem.
Você pode assumir que a imagem é quadrada e que o comprimento lateral é múltiplo de quatro.
Saída
A saída é o bloco de entrada, mas convertido em um hexágono (a própria imagem será quadrada, com áreas transparentes). Você pode salvá-lo em um arquivo ou exibir na tela.
Novamente, qualquer formato de imagem comum servirá. Se o formato que você estiver usando suportar transparência, as áreas de segundo plano deverão ser transparentes. Caso contrário, você pode usar a cor # FF00FF (aquela horrível cor de fúcsia) como substituta.
Método
Então, como fazemos isso? O método que eu uso 2 esmaga a imagem um pouco verticalmente, mas no geral parece muito bom para a maioria das coisas. Vamos fazer um exemplo com esta imagem de entrada:
- Escala: Escale a imagem para uma proporção de 3: 2. Como nossas imagens serão quadrados, isso significa que você as dimensiona para 75% de largura e 50% de altura. Como nosso exemplo de entrada é 200x200, acabamos com esta imagem de 150x100:
- Lado a lado: Coloque cópias da imagem em escala em uma grade 2x2:
- Cortar: Pegue um hexágono de tamanho apropriado de qualquer lugar nesta grade 2x2. Agora, para facilitar a telha, esse hexágono não é exatamente regular. Depois de cortar um quadrado do tamanho original (aqui 200x200), você corta os cantos. As linhas de corte devem percorrer (aproximadamente) o centro de cada lado esquerdo / direito a um quarto da borda na parte superior / inferior:
E essa é a sua saída!
Aqui está um exemplo de como pode parecer quando ladrilhado (ampliado aqui):
Este é o código golf, pelo que o código mais curto em bytes vence. Aplicam-se brechas padrão, etc. e assim por diante.
1 Sinta-se livre para acreditar nisso ou não.
2 Método um deste site útil.
Respostas:
Matlab,
223 215 209 184163 bytesO redimensionamento é bastante direto. Para cortar os cantos, sobreponho um sistema de coordenadas sobre os pixels e faço uma máscara através de quatro desigualdades lineares, que determinam a área do hexágono.
PS: Isso se transformou em um jogo de codegolf nim com a participação de @ MartinBüttner: você alternativamente precisa tornar seu código mais curto (ao mesmo tempo em que fornece a mesma funcionalidade) - aquele que pode fazer o último 'encurtamento' vencer =)
fonte
[k.*[2 3]/4]
.Mathematica,
231211209208201188173 bytesEsta é uma função sem nome que pega um objeto de imagem e retorna um objeto de imagem:
Acho que não há muito o que explicar aqui, mas alguns detalhes que são importantes:
ImageAssemble[{{#,#},{#,#}}]
, ou seja, entregariaImageAssemble
uma matriz 2x2 com cópias da imagem. No entanto, existeImageCollage
algum tipo de função mágica que tenta organizar um monte de fotos o mais "possível" (o que quer que isso signifique ... você pode até dar pesos e outras coisas às imagens individuais). De qualquer forma, você fornece quatro imagens de tamanho igual e com pesos iguais (ou nenhum), também as organizará em uma grade 2x2. Isso me permite salvar alguns bytes para o aninhamento da matriz, bem como o nome da função.Graphics
. Estou usando o built-inRegularPolygon@6
, mas imponha uma proporção1
para esticá-lo conforme necessário. Infelizmente,Graphics
precisa de algumas opções caras para evitar o preenchimento e tal, e também torna preto no branco em vez do oposto. O resultado é fixadoColorNegate
e anexado aos canais originais da imagem comSetAlphaChannel
.Graphics
coloca uma pequena quantidade de preenchimento ao redor do hexágono, mas queremos que o hexágono alfa cubra todo o tamanho do recorte. No entanto,SetAlphaChannel
pode combinar imagens de tamanhos diferentes, centralizando-as umas sobre as outras e cortando-as no menor tamanho. Isso significa que, em vez de configurar manualmentePlotRangePadding->0
, podemos simplesmente ampliar um pouco a imagem do hexágonoImageSize->1.05e
(e precisamos da opção `ImageSize de qualquer maneira).fonte
HTML5 + Javascript, 562 bytes
Recebe a entrada como um URL da imagem via caixa de texto (esperamos que o URL conte como nome de arquivo). Envia os dados para a tela.
Versão que funciona em todos os navegadores (580 bytes):
Teste-o com a imagem "bloqueia" anteriormente através deste URL: http://i.stack.imgur.com/gQAZh.png
fonte
id=A
ao<form>
eid=B
ao<canvas>
, substituindol[0]
porA
el[1]
comB
e removendol=document.body.children;
. (Funciona no Firefox 41; não tenho certeza de quais outros navegadores suportam isso.) Além disso, acredito que há alguns pontos e vírgulas desnecessários ao lado dos colchetes direitos e alguns espaços extras.id=C
ao<input>
e substituire.target.children[0]
porC
.0.75
é igual a3/4
,1/0.75
é igual a4/3
,d/4+d/2
é igual ad*3/4
, e os zeros à esquerda nos outros decimais não são necessários. Eu também acredito que você poderia substituir o primeiroc.drawImage
porc[p="drawImage"]
, e depois cada um porc[p]
; você poderia fazer o mesmo comc.lineTo
.Python 2 + PIL, 320
Lê o nome do arquivo de imagem de stdin.
fonte
PIL
útil para tentar e não pensei o suficiente. AindaPHP, 293 bytes
Adicionei algumas novas linhas para facilitar a leitura:
Aqui está a versão não destruída:
fonte