Thorsten Kimmeskamp
Published © GPL3+

Lissajous-Kurven auf dem Calliope mini

Mathe kann schön sein, zumindest optisch ;-): Lass den Calliope hübsche "Lissajous-Kurven" zeichnen und sie sogar animieren!

AdvancedFull instructions provided1 hour212
Lissajous-Kurven auf dem Calliope mini

Things used in this project

Hardware components

Calliope mini
Calliope mini
×1

Story

Read more

Code

lissajous

Python
a = 1  # Frequenz horizontal
b = 2  # Frequenz vertikal (interessante Paare a/b sind z. B.: 1/1, 1/2, 1/3, 2/3)
delta_fix = 0  # feste Phasenverschiebung (in Bogenmass, z. B.: Math.PI/2)
delta_var = 0  # Hilfsvariable fuer variable Phasenverschiebung (Animation)
animation = True   # variable Phasenverschiebung an/aus
einzelschritt = False  # 100 ms Pause nach jedem berechneten Punkt
anzahl_punkte = 26  # Anzahl der berechneten Punkte pro Kurve
anzahl_frames = 8  # Anzahl der berechneten Kurven in der Animation
schritt_kurve = Math.PI * 2 / anzahl_punkte  # Sinus hat Periode 2*Pi
schritt_animation = Math.PI * 2 / min(a, b) / anzahl_frames  # Zyklus wiederholt sich bei 2*Pi/min(a,b)
verzoegerung = 4000 / anzahl_frames  # ca. 4 Sek. Animationsdauer insgesamt (ohne Einzelschritt)

def zeichne_kurve():
    x = 0  # Bildschirm x-Koord. zu zeichnender Punkt
    y = 0  # Bildschirm y-Koord. zu zeichnender Punkt
    t = 0  # Zeit
    while t < Math.PI * 2:  # fuer die komplette Kurve:
        x = Math.round(2 * Math.sin(a * t)) + 2  # x-Koord. berechnen
        y = 4 - (Math.round(2 * Math.sin(b * t - delta_fix - delta_var)) + 2)  # y-Koord.berechnen
        led.plot(x, y)  # Bildpunkt zeichnen
        if einzelschritt:  # im Einzelschrittmodus:
            basic.pause(100)  # 100 ms Pause nach jedem berechneten Punkt
        t += schritt_kurve  # naechsten Punkt der Kurve betrachten

def on_forever():
    global delta_var  # wir greifen schreibend auf die variable Phasenverschiebung zu
    zeichne_kurve()  # zeichne Kurve mit aktuellen Parametern
    if animation:  # bei angeschalteter Animation:
        basic.pause(verzoegerung)  # warte nach jedem Frame
        basic.clear_screen()  # loesche Bildschirm
        delta_var += schritt_animation  # naechster Animationsschritt

basic.forever(on_forever)

Credits

Thorsten Kimmeskamp
19 projects • 13 followers

Comments