Rosen für den HP-85

RosenkurvenMathematik 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 Zeichen­sprache 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 Mathe­matiker 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) selbst­erklä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 Zeichen­ge­schwindigkeit. 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.

Rosenkurve
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 Graphik­schirmen 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
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.

Rosenkurve
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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.