Mathematik ist schön. Ihre Kurven sind elegant, ihre Formeln klingen wie kristallene Glocken, ihre Zahlen sind geheimnisvolle und wunderbare Wesen, ihre Verhältnisse harmonisch, ihre Zeichensprache ein Gedicht, ihre Geometrien heilig. Sie berührt das Herz und sie bringt den Verstand zum Klingen. (Quelle)
Auch mit einem für heutige Verhältnisse gähnend langsamen HP-85 Tischcomputer lässt sich ein Blick auf diese Schönheit erhaschen. Als Beispiel habe ich mir dazu die Rosenkurve ausgewählt.
Die Blumengleichung
Die Rosenkurve (oder Rhodonea-Kurve) hat ihren Namen vom italienischen Mathematiker Guido Grandi, weil sie einer Rose ähnlich sieht. Die Gleichung der Rosenkurve in Polarform lautet:
r = a sin(kΘ)
Wenn k eine natürliche Zahl n ist, ergibt sich das Bild einer Blume mit n Blütenblättern falls n ungerade bzw. 2n Blütenblättern falls n gerade ist. Ist k = p/q eine rationale Zahl, dann schliesst sich die Kurve beim Winkel Θ = π q f, wobei f = 1 falls p q ungerade und f = 2 falls p q gerade ist. Für irrationale k ist die Rosenkurve nicht geschlossen; auf diesen Fall wird hier nicht näher eingegangen.
Rosenkurven können mit einem kurzen BASIC Programm auf den Bildschirm des HP-85 gezaubert werden. Weil das Programm so einfach, kurz und (hoffentlich) selbsterklärend ist, sei nur folgendes angemerkt:
- Mit dem SCALE Befehl in Zeile 280 wird ein Fenster gewählt, dass einerseits das richtige Bildschirmverhältnis von 4:3 hat und für Parameter a im Bereich ]0,1] passt.
- Auf das Löschen des Graphikschirms mittels Befehl GCLEAR wird bewusst verzichtet, damit man mehrere sich überlagernde Rosenkurven zeichnen kann, z.B. durch Variation des Parameters a.
- Der Parameter dΘ (in Grad) bestimmt, wie genau die Kurve gezeichnet wird und hat im Falle des HP-85 grosse Auswirkungen auf die Zeichengeschwindigkeit. Also geschickt wählen oder enstprechende Geduld aufbringen!
Der Wikipedia-Artikel über die Rosenkurve zeigt ein paar Beispiele für verschiedene Parameter. Sicher ein guter Ausgangspunkt für eigene Experimente.
Vier verschachtelte Rosenkurven, n = 8
Rosenvariation
Peter M. Maurer hat ebenfalls mit Rosenkurven rumgespielt. In seinem Artikel „A Rose is a Rose“ zeigt er, welch interessante Bilder entstehen, wenn man Punkte auf einer Rosenkurve durch Linien verbindet (siehe auch Wikipedia). Die volle Ästhetik entfalten diese nach ihm benannten Maurer-Rosen zwar nur auf hochauflösenden Graphikschirmen oder einem Plotter. Aber da Herr Maurer schliesslich den Zeichenalgorithmus so ausführlich beschrieben hat, habe ich auch hierfür ein BASIC Programm für den HP-85 geschrieben, basierend auf seinem Algorithmus B.
Maurer Rose, n = 8, d = 97
Bei Maurer-Rosen ist oft nicht nur das Endergebnis faszinierend, sondern auch, wie es entsteht. Dazu ist ein so langsamer Rechner wie der HP-85 sogar von Vorteil. Hier noch einige Parametersätze als Einstieg:
Ausprobieren: | n | d |
---|---|---|
2 | 39 | |
2 | 89 | |
3 | 47 | |
4 | 89 | |
4 | 120 | |
5 | 89 | |
5 | 97 | |
6 | 72 | |
7 | 19 | |
9 | 61 | |
13 | 19 | |
14 | 23 | |
14 | 51 | |
17 | 79 | |
30 | 30 | |
30 | 49 | |
31 | 23 | |
36 | 53 | |
40 | 65 |
Rosenkurven – New Style
Mit aktuellen Hilfsmitteln sind der Kreativität fast keine Grenzen gesetzt. Mit Python und dem Grafikpaket PyX lassen sich im Handumdrehen farbige Rosenkurven im PDF Format erzeugen.
Farbige Rosenkurven mit Python
Als Anregung hier noch das Python Programm, mit dem dieses Bild erzeugt wurde.
import sys, math, pyx def polar_to_rect(r, t): return (r*math.cos(t), r*math.sin(t)) def color(i): return pyx.color.rgb(1-i*0.15, 0, 0.2) def rose(a, p, q, dt): f = 2-((p*q)%2) c = 180*q*f k = float(p)/float(q) curve = pyx.path.path(pyx.path.moveto(0, 0)) t = dt while t < c: r = a*math.sin(math.radians(k*t)) (x, y) = polar_to_rect(r, math.radians(t)) curve.append(pyx.path.lineto(x,y)) t = t+dt curve.append(pyx.path.closepath()) return curve if len(sys.argv) != 4: sys.exit("usage: frose n dt filename") n = int(sys.argv[1]) dt = float(sys.argv[2]) c = pyx.canvas.canvas() for i in range(0, 4): curve = rose(10-2*i, n, 1, dt) c.fill(curve, [color(i)]) curve = rose(10, n, 1, dt) c.stroke(curve, [color(4), pyx.style.linewidth(0.2)]) c.writePDFfile(sys.argv[3], bboxenlarge=10*pyx.unit.t_pt)
1 Kommentar