Disegno di reti 3d - Solidi platonici


14

Questa è una versione base delle reti 3D da disegno piuttosto più difficili : i solidi di Archimede .

Ho un debole per le reti 3d che, se ritagliate e piegate, ti consentono di creare forme 3d con carta o carta. Il compito è semplice, scrivi il programma più breve che puoi che disegna reti per i 5 solidi Platonici. L'output dovrebbe essere un file di immagine in qualsiasi formato ragionevole di tua scelta (png, jpg, ecc.).

Tutte e cinque le forme sono descritte su http://en.wikipedia.org/wiki/Platonic_solid . Le loro reti si presentano così (prese da http://www.newscientist.com/gallery/unfolding-the-earth/2 ).

inserisci qui la descrizione dell'immagine

Input: un numero intero compreso tra 1 e 5. Supponiamo che le forme siano numerate nell'ordine del numero di lati che hanno. Quindi, 1 sarebbe un tetraedro e 5 l'icosaedro.

Output: un file di immagine contenente la rete per quella forma. Solo il contorno, comprese le linee interne, è OK. Non è necessario riempirlo con i colori

Puoi usare qualsiasi linguaggio di programmazione che ti piace e qualsiasi libreria non creata appositamente per questa competizione. Entrambi dovrebbero essere disponibili gratuitamente comunque (in entrambi i sensi) online.

Accetterò la risposta con il minor numero di personaggi in esattamente una settimana.

Vincitore. Un solo concorrente ma è stato meraviglioso. Il vincitore è ... Raufio per quello che è il mio pezzo preferito di golf da codice di sempre.

Risposte:


8

Python, 456 429 381

import turtle as t
L="fl"
R="fr"
d=L*3+R*3
b=(d+R)*3
a=[b,120,L*3+"fflflffflflfrflflfffl"+R*4+"flf",90,b+"ffrfrflffrffrfrfrflflf",120,(R*5+L*5+R+L)*5+"rrfr"+L*5+R*2+L*2+R*4+"f",72,(d+"f")*5+"rfl"+((d+"b")*5)[:-1],120]
l=t.lt
f=t.fd
b=t.bk
r=t.rt
p=input()*2-2 
t.setup(.9,.9)
t.goto(-200,150)
t.clear()
for c in a[p]:exec c+"(a[p+1])"
t.getscreen().getcanvas().postscript(file="o")

Ho implementato un interprete primitivo con l r f bcome operatori che muovono il cursore della tartaruga all'angolo delle forme. Una volta, gira solo un angolo. Ho compresso le stringhe riutilizzando le stringhe (un po 'come psuedo-subroutine), a parte questo, non ho controllato per vedere se stavo usando il percorso migliore. Emette in un file PostScript.

Una piccola spiegazione del codice non golfato:

import turtle as t
Left="fl"
Right="fr"
diamond= Left*3 + Right*3
tetrahedron=(d+R)*3 #used to be b

Importa il modulo tartaruga incorporato e definisce le macro che accorciano le stringhe. Il modulo tartaruga utilizza i comandi per spostare una "tartaruga" sullo schermo (ovvero avanti (100), sinistra (90))

netList=[
   #tetrahedron
   tetrahedron,120,
   #cube
   Left*3+"fflflffflflfrflflfffl"+Right*4+"flf",90,
   #octohedron, builds off the tetrahedron
   tetrahedron+"ffrfrflffrffrfrfrflflf",120,
   #dodecahedron
   (Right*5 + Left*5 + Right + Left)*5
    +"rrfr"+
    Left*5 + Right*2 + Left*2 + Right*4 + "f",72,
   #icosahedron
   (diamond+"f")*5 +"rfl"+((diamond+"b")*5)[:-1],120
]

Questo elenco contiene gli angoli e le sequenze di movimento. Il tetraedro è stato salvato per essere riutilizzato con gli ottedri.

l=t.left
f=t.forward
b=t.back
r=t.right

Questa è la parte che mi piace, rende le funzioni locali a carattere singolo in modo che le chiamate possano essere abbreviate e automatizzate attraverso stringhe predefinite.

input=int(raw_input())*2-2 
t.setup(.9,.9)
t.goto(-200,150)
t.clear()

Questo inizia prendendo l'input (tra 1 e 5) e convertendolo in un indice che punta alla stringa di forma in netList. Queste tartarughe di installazione per mostrare l'intera rete. Questi potrebbero essere esclusi se il compito era solo quello di disegnarli, ma poiché abbiamo bisogno di un output dell'immagine sono necessari.

for command in netList[input]:
    exec command+"(netList[input+1])"
t.getscreen().getcanvas().postscript(file="o")

Il ciclo for accetta i comandi nella stringa della sequenza di comandi e li esegue, quindi per una stringa come "fl", esegue "forward (angle); left (angle);" chiamando le funzioni locali appena create. l'ultima riga genera un file chiamato 'o' che è in formato Postscript usando la funzione tartaruga.

Per eseguire :

Copialo in un file ed eseguilo da lì. Quando lo esegui, attenderà un numero compreso tra 1 e 5 (l'ho appena cambiato in modo che lo chieda prima di impostare la tartaruga). Quando si inserisce un numero, viene visualizzata una finestra che disegna la rete. se vuoi che vada più veloce puoi aggiungere t.speed(200)prima setup.

Puoi copiarlo e incollarlo nell'interprete, ma quando raw_input()viene chiamato consuma la stringa successiva che inserisci "t.setup(.9,.9)"invece di un numero. Quindi, se lo fai, copia fino a raw_input(), inserisci un numero, quindi copia incolla il resto. È inteso per essere eseguito nel suo complesso. Oppure potresti copiarlo in una funzione e chiamarlo.

Ecco i suoi output (convertiti da Postscript):

Nota: la posizione di questi nella finestra è cambiata, ma la loro forma generale è la stessa.

tetraedro cubo ottaedro dodecaedro icosaedro

È una piccola forza bruta per il golf del codice, ma mi sono stancato di cercare di trovare un modello coerente tra le forme.


Molto vicino. Il dodecaedro è decisamente più complicato.
Felipa,

@Raufio È molto carino. Non è possibile definire un triangolo (o quadrato o pentagono) e quindi semplicemente ruotarlo / spostarlo? O è effettivamente quello che hai fatto?
Felipa,

In effetti, sì, è quello che ho fatto, ma con forme più grandi. Ad esempio, l'icosaedro viene disegnato disegnando due triangoli, uno sopra l'altro, e spostandosi in avanti di 5 volte, quindi ripristinando una nuova posizione, estraendo nuovamente il diamante che si sposta indietro e ripetendo 5 volte. dè la stringa che fa i due triangoli, quindi è(d+'f')*5+setupPosition+(d+'b')*5
Raufio,

@Raufio Il codice golf non funziona per me. Apre una finestra in gran parte vuota. Se poi premo return ottengo p = (ord (raw_input ()) - 49) * 2 TypeError: ord () previsto un carattere, ma trovata una stringa di lunghezza 0
felipa

1
@felipa setuprende la finestra della tartaruga abbastanza grande da contenere la rete. La stessa cosa con goto, sposta la 'tartaruga' a -200, 150. clearcancella la linea creata da goto. I loro giusti comandi per impostare il disegno. p=(ord(raw_input())-49)*2accetta un numero, da 1 a 5, corrispondente alla forma desiderata.
Raufio,

6

matematica

Fuori concorso, non una lingua gratuita (a meno che una prova gratuita sia considerata gratuita)

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

Uso:

f /@ Range@5

Grafica Mathematica


1
Mathematica non è assolutamente gratuita in entrambi i sensi. Risposta molto bella comunque.
Felipa,

@felipa è gratuito come nella birra del Raspberry Pi.
Shrx,

sai, su quel computer gratuito, il lampone pi
undergroundmonorail il

6

Python 2 (con cairo) - 239

from cairo import*
s=PSSurface(None,99,99)
g=Context(s)
g.move_to(30,20)
a=str([34,456,3455,568788,3454445555][input()-1])
f=6.28
for c in a+a[::-1]:exec'g.rel_line_to(8,0);g.rotate(f/int(a[0]));'*int(c);f=-f
g.stroke()
s.write_to_png('o')

risultati:

risultati


3

Logo, 199 byte

TO p:d:n:s
rt :n*45 for[i 1 :n/8][pu setxy :d*:i 0 pd repeat 2[for[k 1 :s*2+2][fd 40 rt (360-720*(:k>:s))/:s] rt 720/:s]]END
TO q:j
apply "p item :j [[70 9 3][56 23 4][70 16 3][105 26 5][40 42 3]]END

Leggendo questo, vedo che la mia versione originale non era conforme alle specifiche scritte (prendi un argomento numerico e disegna una forma) ma piuttosto interpretate da alcune delle altre risposte (disegna tutte le forme). La nuova versione risolve questo problema. Si aspetta di essere chiamato come ad esempio q 5. csdovrebbe essere fatto prima di cancellare lo schermo e puntare la tartaruga verso nord.

qchiama la funzione principale pcon 3 argomenti. La sintassi per questo è piuttosto gonfia, quindi per battere il mio punteggio precedente ho dovuto radere byte altrove.

la nuova versione di paccetta 3 argomenti. Non è necessario xe ypoiché tracciamo solo una rete, ma dil passo tra le subunità rimane. s è ancora il numero di lati per poligono, e nora codifica per due cose diverse> n/8è il numero di subunità da tracciare, ed n*45è un angolo attraverso il quale la tartaruga deve essere girata prima di iniziare (sfruttando la mod naturale 360 ​​per le rotazioni. )

Il loop migliorato consente di disegnare slinee con rotazione a destra e s+2linee con rotazione a sinistra in un singolo loop.

l'interprete dei calormen sembra essere meno tollerante nei confronti degli spazi bianchi mancanti rispetto al mio primo post, ma il codice funziona bene su http://turtleacademy.com/playground/en

Logo, 200 byte

TO p:x:y:d:n:s
for[i 1:n][pu setxy:x:y-:d*:i if:i<>6[pd]repeat 2[repeat:s[fd 40 rt 360/:s]repeat:s+2[fd 40 lt 360/:s]rt 720/:s]]END
p 0 200 40 7 3
p 70 0 80 2 3
p -200 200 105 3 5
rt 45
p 90 90 56 2 4

Interprete su http://www.calormen.com/jslogo/# Si presume che la tartaruga stia puntando verso nord prima che il programma venga eseguito. Utilizzare il cscomando per cancellare lo schermo, puntare la tartaruga verso nord e posizionarla sull'origine al centro dello schermo.

inserisci qui la descrizione dell'immagine

L'unità di base di tutte le reti sopra è una coppia di poligoni back to back. Questi sono disposti in 2 file sfalsate, formando una subunità di 4 poligoni che possono essere tradotti verticalmente per formare tutte le reti (tranne l'ottaedro, che fa un giro sul disegno dell'icosaedro e del tetraedro). La subunità forma 1 rete di tetraedro, 1/5 della rete di icosaedro, 1/3 della rete di dodecaedro e 2/3 della rete del cubo (vengono disegnate due subunità, con i due quadrati centrali sovrapposti.)

Codice Ungolfed

TO p :x :y :d :n :s                 ;x,y=starting point d=negative vertical offset for each iteration n=#of iterations s=# of sides on polygon
  for[i 1 :n][                      ;iterate n times 
    pu                              ;pen up
    setxy :x :y- :d* :i             ;move pen to start of iteration
    if :i<>6[pd]                    ;pen down (supressed for i=6 to enable part of octahedron to be drawn with icosahedron)
    repeat 2[                       ;draw lower row of 2 polygons, then upper row of 2 polygons
      repeat :s[fd 40 rt 360/ :s]   ;starting at lower left of polygon facing up, draw righthand polygon
      repeat :s+2[fd 40 lt 360/ :s] ;starting at lower right of polygon facing up, draw lefthand polygon, duplicating last two sides
      rt 720/ :s                    ;return turtle to upwards facing in order to draw second row
    ]
  ]
END
cs
p 0 200 40 7 3                      ;draw icosahedron and left side of octahedron (6th iteration is suppressed)
p 70 0 80 2 3                       ;draw right side of octahedron, and tetrahedron
p -200 200 105 3 5                  ;draw dodecahedron
rt 45                               ;turn turtle in preparation for drawing cube
p 90 90 56 2 4                      ;draw cube

@phase haha, grazie, in realtà ho pensato di fare un htper nasconderlo per l'immagine. Sono contento di non averlo fatto!
Level River St,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.