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.
quelle
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.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.Antworten:
Python 2.7, 949 Bytes
Hier ist die Lösung für das reguläre Dodekaeder, das mit matplotlib aufgezeichnet wurde. Der grobe Umriss für den ungolfed Code (hier nicht gezeigt) ist unten skizziert:
quelle
Ruby, 784 Bytes * 0,5 * 0,7 = 274,4
Meine eigene Antwort, daher nicht für mein Kopfgeld berechtigt.
Berechtigt sowohl für den eingebauten Nicht-3D-Bonus als auch für den Bonus zum Zeichnen aller Stellationen.
Eingabe als Funktionsparameter
Eine ganze Zahl 0..3, die einem regulären Dodekaeder, einem kleinen Dodekaeder und einem großen Dodekaeder entspricht
Eine Anordnung von drei ganzen Zahlen, die Gradwinkeln für Rotationen um die x-, y- und x-Achse (wieder) entsprechen (richtige Euler-Winkel, damit jede Rotation erreicht werden kann).
Geben Sie eine Datei aus
p.svg
, die in einem Webbrowser angezeigt werden kann.Erläuterung
Die Arrays x, y, z am unteren Rand des Codes enthalten die Koordinaten der äußeren Punkte einer Seite eines kleinen Stern-Dodekaeders. Dies kann in das Ikosaeder eingeschrieben werden, dessen 12 Eckpunkte durch die zyklischen Permutationen von (+/- 377, + / - 233, + / - 0) definiert sind. Beachten Sie, dass 377 und 233 aufeinanderfolgende Fibonacci-Zahlen sind und daher 377/233 eine hervorragende Annäherung an den Goldenen Schnitt darstellt.
Ein zusätzliches Array w enthält die x-Koordinaten multipliziert mit -1, was der Reflexion in der x-Ebene entspricht. Die Funktion f wird 6 Mal aufgerufen, einmal für jede Farbe, mit den verschiedenen zyklischen Permutationen von x, y, z und w, y, z.
Die drei Umdrehungen werden als Parameter in n [] übergeben. Um sin und cos in Ruby zu verwenden, ist es notwendig, dies zu tun
include Math
. Um dies zu vermeiden, werden der Kosinus und der Sinus des Winkels erhalten, indem die Quadratwurzel von -1"i"
auf eine Potenz von (Winkel in Grad / 90) angehoben wird. Der Real- und Imaginärteil dieser Zahl werden in k (Kosinus) und l ( Sinus)Vor der Drehung werden x- und y-Werte ausgetauscht. Dann wird eine Matrixmultiplikation auf die y- und z-Werte angewendet, um eine Drehung um die x-Achse zu ergeben. Durch den Austausch von Werten können die drei Umdrehungen in einer Schleife ausgeführt werden.
Bisher haben wir nur einen Punktering. Um den Rest zu erhalten, müssen wir das Zentrum des Fünfecks / Sterns finden. Dies erfolgt durch Ermitteln des Durchschnitts der Koordinaten der 5 Eckpunkte, die in p, q, r gespeichert sind.
Wie bereits erwähnt, wird nur ein Funktionsaufruf pro Farbe ausgeführt. Das Vorzeichen von r (der Durchschnitt der z-Koordinaten und damit die Koordinate des Gesichts) wird getestet. Wenn es positiv ist, ist das Gesicht eine Vorderseite und daher sichtbar. Wenn es negativ ist, ist das Gesicht eine Rückseite. Es ist unsichtbar und wir haben keinen Funktionsaufruf für das gegenüberliegende Gesicht. Daher müssen alle drei Koordinaten invertiert werden. Das Vorzeichen von r wird in e gespeichert, um dies zu erleichtern.
Das Gesicht besteht aus 5 Dreiecken, deren Eckpunkte lineare Kombinationen der äußeren Eckpunkte des kleinen sternförmigen Dodekaeders und der Mitte des Gesichts sind. Im Fall des kleinen sternförmigen Dodekaeders setzen wir für die Spitzen der Dreiecke a = 1 und b = 0 (Beitrag 1 von x, y, z und 0 von p, q, r). Für die 2 Basisscheitelpunkte des Dreiecks setzen wir c = -0,382 (Beitrag 1 / Goldener Schnitt ^ 2 von x, y, z) und d = 1,382 (Beitrag von p, q, r). Der Grund für den negativen Beitrag ist dass die Basisscheitelpunkte des Dreiecks in Bezug auf die gegenüberliegenden Spitzen definiert sind, die sich auf der gegenüberliegenden Seite der Fläche befinden. Die erhaltenen Koordinaten werden nach Bedarf mit e multipliziert.
Die vier unbenannten Arrays, deren Werte so zugewiesen sind,
a,b,c,d
dass sie die erforderlichen Werte für das reguläre Dodekaeder, das kleine Dodekaeder, das große Dodekaeder und das große Dodekaeder enthalten, werden gemäß der Variablen ausgewählt.t
Beachten Sie, dass für das kleine Dodekaeder und das große Dodekaeder a + b = c + d = 1. Die Beziehung a + b = c + d gilt für die anderen Formen, es wird jedoch eine andere Skala angewendet.Für jedes Dreieck wird eine Zeile SVG-Code erstellt. Diese enthält eine ID, die aus der Summe der z-Koordinaten der drei Eckpunkte des Dreiecks, einer Beschreibung der Eckpunkte der drei Koordinaten des Dreiecks und einer Farbe abgeleitet ist. Beachten Sie, dass wir in der orthografischen Projektion direkt entlang der z-Achse schauen. Somit ist 2D x = 3D x und 2D y = 3D y. Die Zeile wird hinzugefügt
h.
Nachdem alle Funktionsaufrufe abgeschlossen sind, wird h so sortiert, dass die Dreiecke mit dem höchsten z-Wert (vorne) zuletzt gezeichnet werden, und das Ganze wird als SVG-Datei mit dem entsprechenden Kopf- und Fußzeilentext gespeichert.
Ungolfed im Testprogramm
Ausgabe
für kleine sternförmige Dodekaeder (wird bald einige Bilder der anderen Polygone hinzufügen)
1,0,0,0 Ausgangsposition
1,30,0,0 um 30 Grad nach unten drehen
1,0,30,0 um 30 Grad nach rechts drehen (Hinweis: Für eine perfekte Seitenansicht wäre die Drehung
atan(1/golden ratio)
= 31,7 Grad, daher sehen wir immer noch einen kleinen blauen Streifen)1,0,20,0 um 20 Grad nach rechts drehen
1,60,10, -63 nach unten, rechts und oben drehen (Orientierungsbeispiel nur mit 3 Umdrehungen möglich)
0,30,0,0 reguläres Dodekaeder
2,0,20,0 großes Dodekaeder
3,45,45,45 großes Stern-Dodekaeder
quelle
Mathematica,
426424 BytesVerwendet die integrierte Funktion
Graphics3D
, um die Form anzuzeigen. Die meisten Bytes werden jedoch von den komprimierten Scheitelpunktpositionen belegt, die dannPartition
in eine Form gebracht werden, die von verwendet werden kannPolygon
. Schließlich:Beachten Sie, dass diese Form durch Klicken und Ziehen gedreht werden kann.
quelle