Ziel dieser Herausforderung ist es, eine Animation eines Kettenantriebssystems zu erstellen , das aus einem Satz Kettenrädern besteht, die durch eine Kette miteinander verbunden sind .
Allgemeine Anforderungen
Ihr Programm erhält eine Liste von Kettenrädern , die als (x, y, radius)
Drillinge angegeben sind. Das sich ergebende Kettenantriebssystem ist dieser Kettenräder umfasst, von einem miteinander verbundenen geschlossenen gespannten Kette über jede von ihnen vorbei, um . Ihr Ziel ist es, eine Endlosschleifen-Animation zu erstellen , die das System in Bewegung zeigt. Zum Beispiel angesichts der Eingabe
(0, 0, 16), (100, 0, 16), (100, 100, 12), (50, 50, 24), (0, 100, 12)
sollte die Ausgabe ungefähr so aussehen
.
Das Koordinatensystem sollte so sein, dass die x-Achse nach rechts und die y-Achse nach oben zeigt. Sie können davon ausgehen, dass die Radien gerade Zahlen größer oder gleich 8 sind (wir werden später sehen, warum dies wichtig ist.) Sie können auch davon ausgehen, dass mindestens zwei Kettenräder vorhanden sind und dass sich die Kettenräder nicht schneiden . Die Einheitendes Eingangs sind nicht zu kritisch. In allen Beispielen und Testfällen in diesem Beitrag werden Pixel als Eingabeeinheiten verwendet (z. B. beträgt der Radius des mittleren Kettenrads in der vorherigen Abbildung 24 Pixel;). Versuchen Sie, nicht zu stark von diesen Einheiten abzuweichen. In der restlichen Herausforderung werden räumliche Größen in den gleichen Einheiten wie die Eingabe angegeben - achten Sie darauf, dass die Proportionen stimmen! Die Abmessungen des Abtriebs sollten geringfügig größer sein als der Begrenzungsrahmen aller Kettenräder und so groß sein, dass das gesamte System sichtbar ist. Insbesondere sollten die absoluten Positionen der Kettenräder die Leistung nicht beeinflussen; nur ihre relativen Positionen sollten (also, wenn wir zum Beispiel alle Kettenräder im obigen Beispiel um den gleichen Betrag verschoben, würde die Ausgabe gleich bleiben.)
Die Kette sollte an allen Berührungspunkten tangential zu den Kettenrädern und an allen anderen Stellen gerade sein . Die Kette sollte so über die Kettenräder geführt werden, dass sich benachbarte Kettensegmente (dh Teile der Kette zwischen zwei Kettenrädern, die sich am selben Kettenrad treffen) nicht schneiden .
.
Während beispielsweise das linke System oben gültig ist, ist das mittlere nicht gültig, da sich die beiden benachbarten Kettensegmente, die über das untere linke Kettenrad verlaufen, kreuzen. Beachten Sie jedoch, daß das richtige System ist gültig, da die beiden sich schneidende Kettensegmente nicht benachbart sind (dieses System durch einen anderen Eingang als die beiden anderen erzeugt wird, wenn.)
Um die Dinge einfach zu halten (r), können Sie annehmen, dass kein Kettenrad die konvexe Hülle der beiden benachbarten Kettenräder oder die konvexen Hüllen der Nachbarn und der anderen Nachbarn schneidet . Mit anderen Worten, das obere Kettenrad in der folgenden Abbildung schneidet möglicherweise keinen der schattierten Bereiche.
Kettensegmente können andere Kettenräder als die überfahrenen kreuzen (wie im letzten Testfall). In diesem Fall sollte die Kette immer vor den Kettenrädern erscheinen.
Visuelle Anforderungen
Die Kette sollte aus einer Reihe von Gliedern unterschiedlicher Breite bestehen. Die Breite des schmalen Glieds sollte ungefähr 2 betragen, und die Breite des breiten Glieds sollte ungefähr 5 betragen. Die Länge beider Gliedertypen sollte ungefähr gleich sein. Die Periodeder Kette, dh die Gesamtlänge eines breiten / schmalen Gliederpaares, sollte der 4π-Zahl am nächsten kommen, die eine ganzzahlige Anzahl von Malen in der Länge der Kette entspricht. Wenn die Länge der Kette beispielsweise 1.000 beträgt, sollte ihre Periode 12,5 betragen. Dies ist die Zahl, die 4π (12.566 ...) am nächsten kommt und eine ganzzahlige Anzahl von Malen (80) von 1.000 ergibt. Es ist wichtig, dass die Periode eine ganzzahlige Anzahl von Malen in die Kettenlänge passt, damit an der Stelle, an der sich die Kette wickelt, keine Artefakte vorhanden sind.
Ein Kettenrad mit Radius R sollte aus drei konzentrischen Teilen bestehen: eine zentrale Achse , die ein Kreis mit dem Radius sollte etwa 3 ist ; der Körper des Kettenrads um die Achse, der einen Radius von etwa R - 4,5 haben sollte; und die Felge des Kettenrads um den Körper, die einen Radius von etwa
R - 1,5 haben sollte. Die Felge sollte auch die Zähne des Kettenrads enthalten , die eine Breite von ungefähr 4 haben sollten; Die Größe und der Abstand der Zähne sollten mit den Größen der Kettenglieder übereinstimmen, damit sie gut ineinander greifen.
Die Periode der Zähne des Kettenrads, dh der Abstand zwischen zwei aufeinanderfolgenden Zähnen entlang des Umfangs des Kettenrads, sollte mit der Periode der Kette übereinstimmen. Da die Periode ungefähr 4 & pgr; beträgt und der Radius des Kettenrads garantiert gleichmäßig ist, sollte die Periode fast ganzzahlig in den Umfang des Kettenrads passen, damit an der Stelle, an der keine Artefakte auftreten, keine erkennbaren Artefakte auftreten Die Zähne des Kettenrads winden sich.
Sie können eine beliebige Kombination von Farben für die Kette, die verschiedenen Teile des Kettenrads und den Hintergrund verwenden, sofern diese leicht zu unterscheiden sind . Der Hintergrund kann transparent sein. Die Beispiele in diesem Beitrag gelten #202020
für die Kette, #868481
für die Achse und die Felge #646361
des Kettenrads und für den Körper des Kettenrads.
Animationsanforderungen
Das erste Kettenrad in der Eingabeliste sollte sich im Uhrzeigersinn drehen . Die übrigen Kettenräder sollten sich entsprechend drehen. Die Kette sollte sich mit einer Geschwindigkeit von ungefähr 16π (ungefähr 50) Einheiten pro Sekunde bewegen . Die Framerate liegt bei Ihnen, aber die Animation sollte glatt genug aussehen.
Die Animation sollte sich nahtlos wiederholen .
Konformität
Einige der visuellen Attribute und Proportionen werden absichtlich nur grob angegeben - Sie müssen nicht genau mit ihnen übereinstimmen . Die Ausgabe Ihres Programms muss keine Pixel-zu-Pixel-Kopie der hier angegebenen Beispiele sein, sie sollte jedoch ähnlich aussehen. Insbesondere sind die genauen Proportionen der Kette und der Kettenräder sowie die genaue Form der Kettenglieder und der Kettenradzähne flexibel.
Die wichtigsten Punkte, die zu beachten sind, sind folgende:
- Die Kette muss in der richtigen Reihenfolge über die Kettenräder geführt werden.
- Die Kette sollte an allen Berührungspunkten tangential zu den Kettenrädern sein.
- Die Glieder der Kette und die Zähne der Kettenräder sollten sauber ineinandergreifen, zumindest bis zum richtigen Abstand und der richtigen Phase.
- Der Abstand zwischen den Gliedern der Kette und den Zähnen der Kettenräder sollte so sein, dass an der Stelle, an der sie sich wickeln, keine erkennbaren Artefakte auftreten.
- Die Kettenräder sollten sich in die richtige Richtung drehen.
- Die Animation sollte sich nahtlos wiederholen.
Letztendlich ist es das Ziel dieser Herausforderung, technisch gesehen den kürzesten Code zu schreiben. Wenn Sie jedoch kreativ werden und eine aufwändigere Ausgabe erzielen möchten, sollten Sie sich auf jeden Fall dafür entscheiden!
Herausforderung
Schreiben Sie ein Programm oder eine Funktion , erstellen Sie eine Liste der Kettenräder und erstellen Sie eine entsprechende Animation des Kettenantriebssystems, wie oben beschrieben.
Ein- und Ausgang
Sie können die Eingabe über die Befehlszeile , über STDIN , als Funktionsargumente oder mit einer äquivalenten Methode vornehmen . Sie können jedes geeignete Format für die Eingabe verwenden, müssen es jedoch in Ihrem Beitrag angeben.
Als Ausgabe können Sie die Animation direkt anzeigen , eine Animationsdatei (z. B. ein animiertes GIF) oder eine Folge von Frame-Dateien erstellen (in diesem Fall ist jedoch ein kleiner Nachteil zu erwarten; siehe unten). Wenn Sie die Dateiausgabe verwenden, Stellen Sie sicher, dass die Anzahl der Frames angemessen ist (in den Beispielen in diesem Beitrag werden nur sehr wenige Frames verwendet;). Die Anzahl der Frames muss nicht minimal sein, Sie sollten jedoch nicht zu viele überflüssige Frames erstellen. Wenn Sie eine Folge von Frames ausgeben , müssen Sie die Framerate in Ihrem Beitrag angeben .
Ergebnis
Das ist Code-Golf . Die kürzeste Antwort in Bytes gewinnt.
+ 10% Strafe Wenn Ihr Programm eine Folge von Bildern als Ausgabe erstellt, anstatt die Animation direkt anzuzeigen oder eine einzelne Animationsdatei zu erstellen, erhöhen Sie Ihre Punktzahl um 10%.
Testfälle
Test 1
(0, 0, 26), (120, 0, 26)
Test 2
(100, 100, 60), (220, 100, 14)
Test 3
(100, 100, 16), (100, 0, 24), (0, 100, 24), (0, 0, 16)
Test 4
(0, 0, 60), (44, 140, 16), (-204, 140, 16), (-160, 0, 60), (-112, 188, 12),
(-190, 300, 30), (30, 300, 30), (-48, 188, 12)
Test 5
(0, 128, 14), (46.17, 63.55, 10), (121.74, 39.55, 14), (74.71, -24.28, 10),
(75.24, -103.55, 14), (0, -78.56, 10), (-75.24, -103.55, 14), (-74.71, -24.28, 10),
(-121.74, 39.55, 14), (-46.17, 63.55, 10)
Test 6
(367, 151, 12), (210, 75, 36), (57, 286, 38), (14, 181, 32), (91, 124, 18),
(298, 366, 38), (141, 3, 52), (80, 179, 26), (313, 32, 26), (146, 280, 10),
(126, 253, 8), (220, 184, 24), (135, 332, 8), (365, 296, 50), (248, 217, 8),
(218, 392, 30)