Papiersterne sind eine große Sache in meiner Familie zu Weihnachten, deshalb dachte ich, ein virtueller wäre cool.
Unten sehen Sie ein Bild eines regulären Dodekaeders (von https://en.wikipedia.org/wiki/Dodecahedron , das dem dort genannten Autor zugeschrieben wird).
Der Prozess der Stellation (Wikipedia) bei Anwendung auf ein Polyeder umfasst das Erweitern der Flächen, bis sie andere Flächen kreuzen. Ausgehend vom regulären Dodekaeder erhalten wir also die folgenden Formen:
Kleines stelliertes Dodekaeder, großes Dodekaeder und großes stelliertes Dodekaeder
Bild von http://jwilson.coe.uga.edu/emat6680fa07/thrash/asn1/stellations.html
Dies sind die drei möglichen Stellationen des Dodekaeders (Wolfram). Sie bilden eine natürliche Entwicklung vom Dodekaeder zum kleinen Dodekaeder, zum großen Dodekaeder und zum großen Dodekaeder, wenn wir die Gesichter immer weiter ausdehnen.
Aufgabe
Ihr Programm oder Ihre Funktion sollte eines der folgenden Polyeder anzeigen oder in eine Bilddatei ausgeben: Normales Dodekaeder, kleines Stern-Dodekaeder, großes Dodekaeder oder großes stelliertes Dodekaeder .
Das Farbschema sollte wie das zweite Bild oben sein. Jedes der sechs Paare gegenüberliegender Flächen muss eine der sechs Farben Rot, Gelb, Grün, Cyan, Blau und Magenta sein. Sie können Standardfarben mit diesen Namen in Ihrer Sprache oder deren Dokumentation verwenden oder die Farben FF0000, FFFF00, 00FF00, 00FFFF, 0000FF und FF00FF verwenden (Sie können diese abschwächen, indem Sie die Intensität auf ein Minimum von 75% reduzieren, falls gewünscht). zum Beispiel durch Reduzieren der Fs auf Cs.)
Beachten Sie, dass wir ein "Gesicht" als alle Bereiche in derselben Ebene definieren. Daher ist in den Bildern oben die Vorderseite gelb (und die parallele Rückseite wäre ebenfalls gelb).
Der Hintergrund sollte schwarz, grau oder weiß sein. Kanten können weggelassen werden, sollten aber beim Zeichnen schwarz sein.
Regeln
Das angezeigte Polyeder muss zwischen 500 und 1000 Pixel breit sein (Breite ist definiert als der maximale Abstand zwischen zwei angezeigten Scheitelpunkten.)
Das angezeigte Polyeder muss in perspektivischer Projektion (Blickwinkel mindestens 5 Breiten vom Polyeder entfernt) oder in orthografischer Projektion (effektiv eine perspektivische Projektion mit dem Blickwinkel im Unendlichen) sein.
Das Polyeder muss aus jedem Winkel sichtbar sein. (Es ist nicht akzeptabel, den einfachsten Winkel auszuwählen und eine fest codierte 2D-Form zu erstellen.) Der Winkel kann vom Benutzer auf eine der folgenden Arten festgelegt werden:
Eingabe von drei Winkeln, die drei Umdrehungen entsprechen, von stdin oder als Funktions- oder Befehlszeilenparameter. Dies können entweder Euler-Winkel (bei denen die erste und die letzte Drehung ungefähr dieselbe Achse haben) oder Tait-Bryan-Winkel (bei denen jeweils eine Drehung um die x-, y- und z-Achse erfolgt) sein. Https://en.wikipedia.org/ wiki / Euler_angles (einfach ausgedrückt, alles geht so lange, wie sich jede Drehung um die x-, y- oder z-Achse und aufeinanderfolgende Drehungen um senkrechte Achsen drehen .)
Möglichkeit für den Benutzer, das Polyeder in Schritten von nicht mehr als 10 Grad um die x- und y-Achse zu drehen und die Anzeige beliebig oft zu aktualisieren (unter der Annahme einer z-Achse senkrecht zum Bildschirm).
Das Polyeder muss fest sein, kein Drahtgitter.
Es sind keine Einbauten zum Zeichnen von Polyedern erlaubt (ich sehe dich an, Mathematica!)
Wertung
Das ist Codegolf. Der kürzeste Code in Bytes gewinnt.
Boni
Multiplizieren Sie Ihre Punktzahl mit 0,5, wenn Sie keine integrierten Funktionen für das 3D-Zeichnen verwenden.
Multiplizieren Sie Ihre Punktzahl mit 0,7, wenn Sie alle drei Sternbilder des Dodekaeders anzeigen können, die vom Benutzer durch eine von stdin eingegebene Ganzzahl 1-3 oder durch Funktions- oder Befehlszeilenparameter ausgewählt werden können.
Wenn Sie sich für beide Boni entscheiden, wird Ihre Punktzahl mit 0,5 * 0,7 = 0,35 multipliziert
Nützliche Informationen (Quellen wie unten)
https://en.wikipedia.org/wiki/Regular_dodecahedron
https://en.wikipedia.org/wiki/Regular_icosahedron
Das Dodekaeder hat 20 Eckpunkte. 8 von ihnen bilden die Eckpunkte eines Würfels mit den folgenden kartesischen (x, y, z) Koordinaten:
(± 1, ± 1, ± 1)
Die restlichen 12 sind wie folgt (Phi ist der goldene Schnitt)
(0, ± 1 / φ, ± φ)
(± 1 / φ, ± φ, 0)
(± φ, 0, ± 1 / φ)
Die konvexe Hülle des kleinen Stern-Dodekaeders und des großen Dodekaeders ist offensichtlich ein reguläres Dodekaeder. Die äußeren Eckpunkte beschreiben ein Ikosaeder.
Laut Wikipedia können die 12 Eckpunkte eines Ikosaeders auf ähnliche Weise wie zyklische Permutationen von (0, ± 1, ± φ) beschrieben werden. Die äußeren Eckpunkte des kleinen Stern-Dodekahers und des großen Dodechaeders (im gleichen Maßstab wie das Dodekaeder oben) bilden ein größeres Ikosaeder, wobei die Koordinaten der Eckpunkte zyklische Permutationen von (0, ± φ ^ 2, ± φ) sind.
Die Winkel zwischen den Flächen für das Dodekaeder und das Ikosaeder betragen 2 Arctan (Phi) bzw. Arccos (- (√5) / 3).
Tipps zum Drehen finden Sie unter https://en.wikipedia.org/wiki/Rotation_matrix
EDIT: Aus Versehen habe ich das reguläre Dodekaeder zugelassen und kann es jetzt nicht zurückziehen. Der x0,7-Bonus für das Zeichnen aller drei sternförmigen Polyeder bleibt erhalten. Am Neujahrstag werde ich ein Kopfgeld von 100 für die Antwort ausgeben, die die meisten der vier Polyeder anzeigen kann, mit dem kürzesten Code als Gleichstand.
Polyhedrondata
ist nicht zulässig, da es sich eindeutig um ein eingebautes Gerät zum Zeichnen von Polyedern handelt. Wenn Ihre Antwort keine eingebauten Elemente zum Zeichnen von Polyedern verwendet und den anderen Regeln entspricht, ist dies akzeptabel. Ihr Punkt scheint zu sein, dass Sie angesichts der Tatsache, dass Sie die Gesichter richtig einfärben müssen, Polyhedrondata
sowieso nicht viel sparen würden, so dass dies in der Praxis eine etwas willkürliche Einschränkung sein kann. Ich stimme bis zu einem gewissen Grad zu, aber es ist für alle fairer, wenn ich es vermeide, Regeln nach dem Posten zu ändern.
dodecahedron
. B. ) sind nicht zulässig . Einige Sprachen verfügen über Funktionen zum Erstellen von 3D-Modellen mit Befehlen wietriangle[[a,b,c],[p,q,r],[x,y,z]]
. Diese Sprachen verfügen im Allgemeinen über integrierte Funktionen zum Drehen und Anzeigen des Modells, wobei automatisch darauf geachtet wird, dass keine verborgenen Gesichter angezeigt werden usw. Lösungen wie diese sind zulässig, ziehen jedoch keinen Bonus an. Der Zweck des Bonus besteht darin, Sprachen ohne diese Einrichtungen wettbewerbsfähig zu machen und auch interessantere Lösungen zu finden.