Le stelle di carta sono una cosa importante nella mia famiglia a Natale, quindi ho pensato che una virtuale sarebbe stata bella.
Di seguito un'immagine di un dodecaedro regolare (da https://en.wikipedia.org/wiki/Dodecahedron , attribuito all'autore ivi citato).
Il processo di stellazione (wikipedia) applicato a un poliedro comporta l'estensione delle facce fino a quando non incrociano altre facce. Quindi partendo dal dodecaedro regolare, otteniamo le seguenti forme:
Piccolo dodecaedro stellato, grande dodecaedro e grande dodecaedro stellato
Immagine da http://jwilson.coe.uga.edu/emat6680fa07/thrash/asn1/stellations.html
Queste sono le tre possibili Stellazioni del dodecaedro (Wolfram). Formano una progressione naturale dal dodecaedro, al piccolo dodecaedro stellato, al grande dodecaedro e al grande dodecaedro stellato, mentre estendiamo sempre più le facce.
Compito
Il programma o la funzione dovrebbe visualizzare o inviare a un file immagine uno dei seguenti poliedri: dodecaedro normale, dodecaedro piccolo stellato, dodecaedro grande o dodecaedro grande stellato .
Lo schema dei colori dovrebbe essere come la seconda immagine sopra. Ognuna delle sei coppie di facce opposte deve essere uno dei sei colori Rosso, Giallo, Verde, Ciano, Blu e Magenta. Puoi utilizzare i colori predefiniti con questi nomi nella tua lingua o nella sua documentazione oppure utilizzare i colori FF0000, FFFF00, 00FF00, 00FFFF, 0000FF e FF00FF (puoi attenuarli riducendo l'intensità a un minimo del 75%, se lo desideri, ad esempio riducendo le F in C.)
Si noti che definiamo una "faccia" come tutte le aree sullo stesso piano. Pertanto, nelle immagini sopra la faccia anteriore è gialla (e anche la faccia posteriore parallela sarebbe gialla).
Lo sfondo deve essere nero, grigio o bianco. I bordi possono essere omessi, ma dovrebbero essere neri se disegnati.
Regole
Il poliedro visualizzato deve avere una larghezza compresa tra 500 e 1000 pixel (la larghezza è definita come la distanza massima tra due vertici visualizzati).
Il poliedro visualizzato deve essere in proiezione prospettica (punto di vista ad almeno 5 larghezze dal poliedro) o in proiezione ortografica (effettivamente una proiezione prospettica con il punto di vista all'infinito).
Il poliedro deve essere visualizzabile da qualsiasi angolazione. (Non è accettabile scegliere l'angolazione più semplice possibile e creare una forma 2D codificata.) L'angolo può essere specificato dall'utente in uno dei seguenti modi:
Immissione di tre angoli corrispondenti a tre rotazioni, da stdin o come parametri di funzione o riga di comando. Questi possono essere gli angoli di Eulero (dove la prima e l'ultima rotazione sono attorno allo stesso asse) o gli angoli di Tait-Bryan (dove c'è una rotazione ciascuno attorno all'asse x, ye z) https://en.wikipedia.org/ wiki / Euler_angles (in poche parole, tutto procede fintanto che ogni rotazione è attorno all'asse x, yo z e le rotazioni consecutive riguardano assi perpendicolari.)
Possibilità per l'utente di ruotare il poliedro in incrementi di non più di 10 gradi attorno agli assi xey e aggiornare il display, qualsiasi numero arbitrario di volte (assumendo l'asse z perpendicolare allo schermo).
Il poliedro deve essere solido, non wireframe.
Non sono ammessi builtin per disegnare poliedri (ti sto guardando, Mathematica!)
punteggio
Questo è codegolf. Vince il codice più breve in byte.
bonus
Moltiplica il tuo punteggio per 0,5 se non usi builtin per il disegno 3D.
Moltiplica il tuo punteggio per 0,7 se riesci a visualizzare tutte e tre le stellazioni del dodecaedro, selezionabili dall'utente per un numero intero 1-3 immesso da stdin o per parametro di funzione o riga di comando.
Se scegli entrambi i bonus, il tuo punteggio verrà moltiplicato per 0,5 * 0,7 = 0,35
Informazioni utili (fonti come di seguito)
https://en.wikipedia.org/wiki/Regular_dodecahedron
https://en.wikipedia.org/wiki/Regular_icosahedron
Il dodecaedro ha 20 vertici. 8 di questi formano i vertici di un cubo con le seguenti coordinate cartesiane (x, y, z):
(± 1, ± 1, ± 1)
I restanti 12 sono i seguenti (phi è il rapporto aureo)
(0, ± 1 / φ, ± φ)
(± 1 / φ, ± φ, 0)
(± φ, 0, ± 1 / φ)
Lo scafo convesso del piccolo dodecaedro stellato e del grande dodecaedro è ovviamente un dodecaedro regolare. I vertici esterni descrivono un icosaedro.
Secondo Wikipedia i 12 vertici di un icosaedro possono essere descritti in modo simile alle permutazioni cicliche di (0, ± 1, ± φ). I vertici esterni del piccolo dodecaheron stellato e del grande dodecedro (sulla stessa scala del dodecaedro sopra) formano un icosaedro più grande, dove le coordinate dei vertici sono permutazioni cicliche di (0, ± φ ^ 2, ± φ).
Gli angoli tra le facce del dodecaedro e dell'icosaedro sono rispettivamente 2 arctan (phi) e arccos (- (√5) / 3).
Per suggerimenti sulla rotazione, consultare https://en.wikipedia.org/wiki/Rotation_matrix
EDIT: Per errore ho permesso il dodecaedro normale, e non posso ritirarlo ora. Il bonus x0,7 per il disegno di tutti e tre i poliedri stellati rimane. Il giorno di Capodanno rilascerò una taglia di 100 per la risposta che può mostrare la maggior parte dei quattro poliedri, con il codice più breve come pareggio.
Polyhedrondata
è vietato in quanto è chiaramente incorporato per disegnare poliedri. Se la tua risposta non usa i builtin per disegnare poliedri e rispetta le altre regole, allora è accettabile. Il tuo punto sembra essere quello dato che devi colorare correttamente le facce, Polyhedrondata
non ti risparmierebbe comunque molto, quindi in pratica potrebbe essere una restrizione in qualche modo arbitraria. Sono d'accordo in una certa misura, ma è più giusto per tutti se evito di cambiare le regole dopo la pubblicazione.
dodecahedron
) non sono consentiti. Alcune lingue hanno strutture per la costruzione di modelli 3D con comandi similitriangle[[a,b,c],[p,q,r],[x,y,z]]
. Queste lingue generalmente hanno built-in per ruotare e visualizzare il modello, avendo cura automaticamente di non mostrare facce nascoste, ecc. Soluzioni come queste sono consentite ma non attireranno il bonus. Lo scopo del bonus è quello di consentire alle lingue che non dispongono di queste strutture di essere competitive, e anche di attrarre soluzioni più interessanti.