Desenho de redes 3d - sólidos arquimedianos


12

Eu tenho uma fraqueza pelas redes 3D que, quando cortadas e dobradas, permitem que você faça formas 3D de papel ou cartão. A tarefa é simples, escreva o programa mais curto possível, que desenha redes para os 13 sólidos arquimedianos. A saída deve ser um arquivo de imagem em qualquer formato adequado (png, jpg).

Todas as treze formas são descritas em http://en.wikipedia.org/wiki/Archimedean_solid e na tabela a seguir, extraída de lá.

insira a descrição da imagem aqui

Entrada: Um número inteiro de 1 a 13. Suponha que as formas sejam numeradas exatamente como na tabela acima, para que o "tetraedro truncado" seja o número 1 e o "dodecaedro desprezível" seja o número 13.

Saída: um arquivo de imagem que contém a rede para essa forma. Apenas o contorno, incluindo as linhas internas, está OK. Não há necessidade de preenchê-lo com cores

Você pode usar qualquer linguagem de programação que desejar, bem como qualquer biblioteca que não tenha sido criada especialmente para esta competição. Ambos devem estar disponíveis gratuitamente no entanto (nos dois sentidos) online.

Aceitarei a resposta com o menor número de caracteres dentro de exatamente uma semana. As respostas serão aceitas sempre que vierem.

(Não) Vencedor ainda. Infelizmente, nenhum participante válido. Talvez seja muito difícil?


Talvez acabar com o prazo completamente? E se alguém descobrir isso daqui a um ano? Você quer que eles não tentem? ... Poderia ter sido melhor fazer o platônico primeiro, espere, depois o difícil. Você pode ter dividido o interesse. Para mim, pessoalmente (tudo isso é extrapolação), quando vi duas semelhantes, eu me afastei dela, sentindo que não tinha tempo para realmente olhar para as duas e planejar como resolvê-las. E eu não gostaria de fazê-lo de outra maneira ... Por outro lado, outros aqui tiveram dificuldades com os desafios da Parte 2. Veja os da Minsky Register Machine. Talvez não seja você.
Luser droog

@luserdroog Thanks. Pergunta editada. Talvez eu devesse acrescentar que enviei a resposta para a pergunta relacionada por muitas pessoas que a amam! FWIW.
felipa

Eu não acho que é difícil de fazer , mas para o golfe exige várias horas de pensar e experimentar, porque há muitas redes possíveis para cada poliedro e eles não irá comprimir igualmente bem.
Peter Taylor

Respostas:


9

Java, 1552

import java.awt.*;import java.awt.image.*;import java.io.*;import javax.imageio.*;class
A{public static void main(String[]x)throws
Exception{String[]a={"33623368356:356;66","33413341334535463547354735473444","33823382338:3586338>358>358>358?88","66456:466:466845684668466766","334144453546354635474746464646464647354634463446344744","88456:466:466:4668458<468<468<468:456846684668466788","33343535353231333535313133353447353434353534313133353447353545343535313133353447353545343444","33513351335233593554335433593554335935543359355433593559355835593559355935593455","33:233:233:433:B35:833:833:B35:833:B35:833:B35:833:B35:B35:833:B35:B35:B35:B35:C::","66566:576:57696869576969586969586:586969576969586857685868586766","334155453546354635463547594658465846584658473546354634463546344635463446354634463547584657465746574657473546344634463446344755","::456:466:466:466:466845:@46:@46:@46:@46:>4568466:4668466:4668466:4668466:4668466845:>46:>46:>46:>46:<45684668466846684667::","333531333434343132333434353531313335343434323232323334343435353231333133343556343434313233323335345935353532313331313132333233353535343557343133343556343434355934353535593432333234355935323335345935323335345935323335345935343459313334353455"};BufferedImage
m=new BufferedImage(1300,1300,1);Graphics2D g=m.createGraphics();g.translate(500,500);String
s=a[Integer.valueOf(x[0])-1];int f=1,i=0,n,t;while(i<s.length()){n=s.charAt(i++)-48;t=s.charAt(i++);while(t-->48){g.drawLine(0,0,20,0);g.translate(20,0);g.rotate(f*Math.PI*2/n);}f=-f;}ImageIO.write(m,"png",new File("o.png"));}}

Ungolfed:

import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class A {
    static int f = 1;
    static Graphics2D g;

    static void fixtrans() {
        double[] m = new double[6];
        g.getTransform().getMatrix(m);
        for (int i = 0; i < 6; ++i) {
            if (Math.abs(m[i] - Math.round(m[i])) < 1e-5) {
                m[i] = Math.round(m[i]);
            }
        }
        g.setTransform(new AffineTransform(m));
    }

    static void d(String s) {
        for (int i = 0; i < s.length();) {
            int n = s.charAt(i++) - '0';
            int t = s.charAt(i++) - '0';
            for (int j = 0; j < t; ++j) {
                g.drawLine(0, 0, 20, 0);
                g.translate(20, 0);
                g.rotate(f * Math.PI * 2 / n);
                fixtrans(); // optional, straightens some lines
            }
            f = -f;
        }
    }

    public static void main(String[] args) throws Exception {
        String[] a = {
                "33623368356:356;66",
                "33413341334535463547354735473444",
                "33823382338:3586338>358>358>358?88",
                "66456:466:466845684668466766",
                "334144453546354635474746464646464647354634463446344744",
                "88456:466:466:4668458<468<468<468:456846684668466788",
                "33343535353231333535313133353447353434353534313133353447353545343535313133353447353545343444",
                "33513351335233593554335433593554335935543359355433593559355835593559355935593455",
                "33:233:233:433:B35:833:833:B35:833:B35:833:B35:833:B35:B35:833:B35:B35:B35:B35:C::",
                "66566:576:57696869576969586969586:586969576969586857685868586766",
                "334155453546354635463547594658465846584658473546354634463546344635463446354634463547584657465746574657473546344634463446344755",
                "::456:466:466:466:466845:@46:@46:@46:@46:>4568466:4668466:4668466:4668466:4668466845:>46:>46:>46:>46:<45684668466846684667::",
// bad          "333531333434343132333434353531313335343434323232323334343435353231333133343556343434313233323335345935353532313331313132333233353535343557343133343556343434355934353531333459343434355935323335345935323335345935323335345935323335345935353455"
                "333531333434343132333434353531313335343434323232323334343435353231333133343556343434313233323335345935353532313331313132333233353535343557343133343556343434355934353535593432333234355935323335345935323335345935323335345935343459313334353455"};

        BufferedImage img = new BufferedImage(1300, 1300, BufferedImage.TYPE_INT_RGB);
        g = img.createGraphics();
        g.translate(500, 500);
        d(a[Integer.parseInt(args[0]) - 1]);
        String f = args[0] + ".png";
        ImageIO.write(img, "png", new File(f));
    }
}

Resultados (aparados, negados, unidos e redimensionados):

resultados

As formas são bastante incomuns :), mas corretas, tanto quanto eu posso dizer (deixe-me saber se você encontrar algum erro). Eles foram gerados (em um programa separado) através da construção do gráfico de faces e ciclos de corte em um DFS.

Tenho certeza de que isso pode ser jogado muito mais usando, por exemplo, python e tartaruga.

Edit: oops, o último caso foi um pouco interceptado. Corrigi o código (à mão), aqui está a imagem atualizada:

13 corrigido


A correção manual significa que o código ainda gera uma interseção automática? Essa é a única coisa que separa isso de uma resposta válida?
precisa

@githubphagocyte Se ele ainda emitisse uma auto-interseção, não seria uma solução. Esta é uma resposta válida.
aditsu saiu porque SE é MAU

Isso foi sinalizado porque viola uma das regras da nossa central de ajuda : Todas as soluções para desafios devem [...] ser um candidato sério aos critérios vencedores em uso. Por exemplo, uma entrada para um concurso de código de golfe precisa ser jogada no golfe.
217 Dennis

@ Dennis melhor agora, mr. policial? : p
aditsu encerrado porque SE é MAU 11/03


6

Mathematica

Fora da competição, não é um idioma livre

f[n_] := PolyhedronData[Sort[PolyhedronData["Archimedean", 
                                             {"FaceCount", "StandardName"}]][[n, 2]],  "NetImage"]

Uso:

f /@ Range@13

Gráficos do Mathematica

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.