Dies ist eine von mehreren Herausforderungen, die Calvins Hobbys für die Community hinterlassen haben .
Die Kurve, die ein idealisiertes hängendes Seil oder eine idealisierte Kette macht, ist eine Oberleitung .
Bild von Bin im Garten, über Wikimedia Commons. Wird unter der CC-By-SA 3.0- Lizenz verwendet.
Schreiben Sie ein Programm, das eine Oberleitung als Bild in Quadrant 1 der Ebene mit zwei Punkten (x 1 , y 1 ) , (x 2 , y 2 ) und der "Seillänge" L zeichnet . L ist größer als der Abstand zwischen den beiden Punkten.
Sie müssen für die Skalierung auch Achsen auf der linken und unteren Seite des Bildes (mindestens 400 x 400 Pixel) zeichnen. Zeichnen Sie den Quadranten nur von x und y im Bereich von 0 bis 100. (Sie können davon ausgehen, dass sich die Punkte im Bereich befinden.)
An den Endpunkten (x 1 , y 1 ) , (x 2 , y 2 ) sollten Punkte oder ähnliches gezeichnet werden , um sie zu unterscheiden. Die Kurve sollte nur im Raum zwischen diesen Punkten gezeichnet werden.
quelle
Antworten:
Python + NumPy + Matplotlib, 1131
Um uns den Einstieg zu erleichtern, hier ein Versuch, bei dem keine anderen Kenntnisse der Analysis oder Physik verwendet werden als die Tatsache, dass die Oberleitung die Energie einer Kette minimiert. Hey, mein Algorithmus ist vielleicht nicht effizient, aber zumindest nicht effizient implementiert!
quelle
BBC Basic, 300 ASCII-Zeichen, Token-Dateigröße 260
Emulator unter http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
Dies wurde offensichtlich schon früher gelöst, also habe ich als erstes nachgesehen, was andere getan haben.
Die Gleichung einer am Ursprung zentrierten Oberleitung ist einfach
y=a*cosh(x/a)
. Es wird etwas komplizierter, wenn es nicht am Ursprung zentriert ist.Verschiedene Quellen sagen, dass, wenn die Länge und die Endpunkte bekannt sind, der Wert für
a
numerisch bestimmt werden muss.h
Der Wikipedia-Artikel enthält einen nicht angegebenen Parameter . Also fand ich eine andere Site und folgte im Grunde der Methode hier: http://www.math.niu.edu/~rusin/known-math/99_incoming/catenaryBBC Grund hat nicht
sinh
undcosh
integriert, so dass ich am Ende des Programms zwei Funktionen definiert , sie berechnen mitEXP
Die Koordinaten für den linken Punkt müssen vor dem rechten Punkt angegeben werden. OP hat bestätigt, dass dies in Ordnung ist. Länge wird zuletzt angegeben. Werte können durch Kommas oder Zeilenumbrüche getrennt werden.
Ungolfed Code
quelle
Python 2.7 + matplotlib, 424
Rennen wie
Wenn ich davon ausgehen kann, dass x0 immer kleiner als x1 ist, reduziert sich die Anzahl der Zeichen auf 398
Die magische Zahl 600, die an einigen Stellen erscheint, ist auf die Tatsache zurückzuführen, dass cosh (x) und sinh (x) um x = 710 überlaufen (also 600, um einen gewissen Spielraum beizubehalten).
quelle