Ein Epizykloid ist die Kurve, die ein Punkt auf einem Kreis macht, wenn er um einen anderen Kreis rollt. Ein Zyklogon ist die Form, die ein Punkt auf einem regulären Polygon beim Rollen über eine Ebene macht. Ein Epizyklogon ist die Kurve, die durch einen Punkt auf einem regelmäßigen Polygon beim Umlaufen eines anderen Polygons gezeichnet wird.
Schreiben Sie ein Programm , das eine epicyclogon zieht gegeben r
, r1
, r2
, n1
, n2
:
r = number of clockwise revolutions rolling polygon makes around stationary polygon (any real number as limited by float values)
r1 = distance from center of stationary polygon to each of its vertices (positive real number)
r2 = distance from center of rolling polygon to each of its vertices (positive real number)
n1 = number of sides stationary polygon has (integer greater than 2)
n2 = number of sides rolling polygon has (integer greater than 2)
Anmerkungen
- Wenn
r
negativ, sollte die Walze gegen den Uhrzeigersinn drehen . - Denn
r
eine Umdrehung tritt auf, wenn die Linie, die die Schwerpunkte der beiden Formen verbindet, um volle 360 Grad überstrichen wird. Dieser Begriff wird erweitert, um alle Werte von einzuschließenr
. (In einer viertel Umdrehung wird die Verbindungslinie zwischen den Zentroiden um 90 Grad überstrichen.) - Diese Argumente sollten von der Kommandozeile kommen oder von Ihrem Programm abgefragt werden (zB mit Python's
input()
). r1
undr2
sind relativ zueinander, nicht die Abmessungen des Bildes. Sie können also eine "Einheit" als eine beliebige Anzahl von tatsächlichen Pixeln festlegen.
Der Punkt, den Sie ausfindig machen müssen, ist einer der Eckpunkte der rollenden Form. Die Formen müssen mit diesem Scheitelpunkt beginnen, der einen stationären Scheitelpunkt und zwei benachbarte Seiten berührt:
Die genauen Startscheitelpunkte und der Winkel des stationären Polygons spielen keine Rolle.
Ausgabe
Die Ausgabe sollte auf ein Bild erfolgen, das mindestens 600 x 600 Pixel groß ist (oder eine variable Dimension, die auf 600 festgelegt werden kann). Es muss die gesamte Epizyklogon-Kurve anzeigen, die von den Parametern angegeben wird und im Bild gut eingerahmt ist.
Die rollenden und stationären Polygone müssen ebenfalls gezeichnet werden (mit der Walze im Endzustand). Die beiden Formen und das Epizyklogon sollten drei deutlich unterschiedliche Farben haben.
Es muss auch eine einfache Möglichkeit geben, die Polygone nicht zu zeichnen (eine Änderung von true
zu false
im Code reicht aus).
Bitte zeigen Sie uns mindestens 2 Ausgabebilder. Es ist in Ordnung, sie bei Bedarf zu verkleinern.
Wertung
Der kürzeste Code, der gültige Ausgabebilder erzeugt, gewinnt.
Boni
- Mindestens 50 Byte, wenn die Ausgabe ein animiertes GIF (oder ähnliches) der Kurve ist, die gezeichnet wird.
- Mindestens 150 Byte, wenn Sie den Wert 2 zulassen
n1
undn2
annehmen, damit die Formen zu Liniensegmenten mit der Länge2 * r1
(oderr2
) werden, die sich "umeinander rollen". Wie Sie mit demr
Zeitpunktn1
und dem Zeitpunktn2
2 umgehen, bleibt Ihnen überlassen, da sich die Zentroiden nicht wie in anderen Fällen umeinander drehen. (Überhaupt nicht "rollen" zählt nicht als Umgang damit.)
Da ich sehr gespannt darauf bin, dass diese neue Idee gut umgesetzt wird (und es ist nicht gerade ein Kinderspiel), werde ich dem Gewinner 150 Bounty Reps verleihen . Der Wettbewerb endet am selben Tag, an dem das Kopfgeld aufgebraucht ist.
Das Kopfgeld wird dem Gewinner nicht gutgeschrieben, wenn klar ist, dass er den größten Teil des Codes von einem anderen Beitrag umgeschrieben hat.
Bibliotheksfunktionen, die dies bereits tun (sofern vorhanden), sind nicht zulässig.
Hinweis: Dies ergab sich aus meinen verbleibenden Fragen , die jeder posten kann. Aber wenn niemand anderes sie postet, habe ich gute Chancen, dass ich es rechtzeitig tun werde. : P
quelle
Antworten:
MATLAB: 735 Bytes - 200 Bonus = 535
Mein Programm behandelt den Fall n = 2 und zeichnet eine Echtzeitanimation. Es gibt ein paar Unterschiede zwischen der Golf- und der Ungolf-Version:
Die ungolfed-Version hat nur die Option, die Animation in einer Datei 'g.gif' zu speichern, indem
savegif = 1
der Code eingestellt wird. Es ist standardmäßig deaktiviert, da es aus folgenden Gründen ärgerlich sein kann:Die GIF-Speicherung musste in der Golf-Version gelöscht werden, da sie ungefähr 100 Bytes benötigte und die Größe des Bonus überschritt.Die ungolfed Version zeichnet einen Kreis auf den Tracer Vertex. Es produziert auch mehr Frames und bewegt sich schneller (obwohl dies in der Golfversion durch Ändern der Zahlen angepasst werden kann).
Proben:
f(11,5,90,2,99,0)
nach Programmendeepic(1.3,4,2,6,6,1)
mit gif ausgabeUngolfed Code
Golf Code
Anleitung:
Speichern Sie die Funktion in einer Datei mit dem gleichen Namen, dh
epic.m
oderf.m
. Führen Sie es aus, indem Sie die Funktion von der Matlab-Konsole aus aufrufen.Verwendung:
epic(r, r1, r2, n1, n2, dispPoly)
DabeidispPoly
handelt es sich um eine boolesche Variable (null, wenn sie falsch ist, eine Zahl ungleich null, wenn sie wahr ist), die bestimmt, ob die Polygone gezeichnet werden sollen.Bearbeiten: Bonus von 50 für animiertes Bild hinzugefügt.
quelle
Java -
2.7262.634 - 200 = 2434 ZeichenVerbessert von 3800 ish Bytes
Vielen Dank an alle für Ihre Vorschläge (insbesondere Pseudonym117), hier ist die neue Version.
Ich habe eine Klasse P hinzugefügt, die die Punktklasse ist, und eine Klasse L, die ArrayList erweitert
Ich habe auch einige kleine logische Änderungen hinzugefügt.
Hier ist die Hauptklasse (nicht Golf):
Und die Golfversion:
Sowie Klassen P:
Und ich:
Ändern Sie int d auf 0 oder 1, um Polygone anzuzeigen
Argumente - 1 100 50 5 2
Argumente - 1,5 100 100 7 3
Argumente - 2 40 100 3 7
quelle
r
wirklich 50 in all deinen Beispielen? Das würde bedeuten, dass die Walze ungefähr 50 Mal läuft.RotatingPolygonsGolfed
im "Golf" -Code steht, während er nurRotatingPolygons
im normalen Code steht. ;)Javascript, 1284 Zeichen (-200 = 1084 Zeichen)
Der minimierte Code ist
Vollständiger Code ist
Eine Fiedel, die Routine in ihrer ganzen Vielschichtigkeit zu betrachten (und Animation zu demonstrieren), findet sich bei
http://jsfiddle.net/7rv751jy/2/embedded/result/
Das Skript definiert eine aufgerufene Funktion
epi
, die die fünf im OP aufgelisteten Parameter akzeptiert.epi
Gibt eine Funktion mit der Signatur zurück,(e,t,isCCW,flags)
die Argumente akzeptiert:e
- ein Verweis auf ein 600x600 HTML5 Canvas-Element, auf dem gerendert werden sollt
- der Gesamtwinkel (im Bogenmaß), den der Schwerpunkt des zweiten Polygons um den Schwerpunkt des ersten Polygons legen soll. Das übergebene Argument sollte das 2-fache der Anzahl der Umdrehungen nicht überschreiten, an die übergeben wurdeepi
.isCCW
- Boolescher Wert, der angibt, ob der Trace im Gegenuhrzeigersinn (im Gegensatz zu einem im Uhrzeigersinn) fortgesetzt werden soll.flags
- eine Reihe von Bit-Flags, die angeben, welche Elemente gerendert werden sollenDie Funktion kann beliebig oft mit unterschiedlichen Argumenten aufgerufen werden.
Einige Notizen:
Die Routine behandelt die entarteten Fälle wo
n1 = 2
und / odern2 = 2
. Beim Animieren verursachen bestimmte Längenkombinationen plötzliche schnelle Fortschritte in der Spur. Dies liegt daran, dass die Animationsframes durch den Winkel zum Schwerpunkt des zweiten Polygons indiziert werden und der Schwerpunkt von d theta poly2 / d theta singulär wird, wenn sich der Schwerpunkt von 2-seitigem poly2 in der Nähe eines Scheitelpunkts von 2-seitigem poly1 befindet Dies hat jedoch keine Auswirkungen auf die Ablaufverfolgung.Die Parameternamen in
epi
werden verwirrend erscheinen, da ich während der gesamten Entwicklung Polygon 1 als "2" und Polygon 2 als "1" bezeichnet habe. Als ich die Inkonsistenz zwischen meiner Konvention und der des OP erkannte, anstatt alle Indizes im Code zu vertauschen, vertauschte ich einfach die Reihenfolge der Argumente inepi
.Die obige Fiedel importiert jQuery, aber dies dient dazu, die Benutzeroberfläche zu handhaben. Die
epi
Funktion hat keine Bibliotheksabhängigkeiten.Der Code verarbeitet CCW-Spuren durch einfaches Umkehren der Y-Achse. Dies ist etwas unelegant, da Polygon 2 während der CCW-Kurven in einer Y-invertierten Position startet, aber niemand sagte, die Routine müsse elegant sein. ;)
quelle
nt = ~~(t*(r_>rC?r_:rC)+1)
aufnt = ~~(t*(r_>rC?r_:rC)/10+1)
und es sollte die Sache etwas beschleunigen.