image image


Rainbow Perlin Noise Worm in Processing.py

Vor etwa drei Wochen hatte ich Euch in diesem Blog Kritzelheft das Video »One Snakey Boi with Perlin Noise (in pure JavaScript)« vorgestellt und geschrieben, daß es mich natürlich in den Fingern juckt, so etwas auch einmal in Processing.py, dem Python-Mode von Processing, zu programmieren. Nun, ich habe es getan:

image

Die in Processing implementierte noise()-Funktion funktioniert leicht anders als die im Video vorgestellte JavaScript-Implementierung. Sie ist deterministisch in Abhängigkeit vom Startwert, daher habe ich t.x mit 0 und t.y mit 10.000 initialisiert. Denn wären beide Startwerte identisch, würde sich der Wurm nur auf der Diagonale bewegen, da dann t.x und t.y immer identisch wären.

t = PVector(0, 10000)

Da background() in draw() nicht mit alpha-Transparenz funktioniert, mußte ich mit createGraphics() ein PGraphics-Objekt erzeugen und die Zeichnung im Hintergrund-Buffer zeichen lassen und sie dann mit image() in das Zeichenfenster übertragen:

    pg.beginDraw()
    pg.background(98, 199, 119, a)
    pg.fill(colors[i])
    pg.circle(x, y, 32)
    pg.endDraw()
    image(pg, 0, 0)

Leider funktioniert beginDraw() nicht mit dem sonst in Processing.py so nützlichen with-Statement, daher mußte es mit endDraw() geklammert werden.

[Update, 12. September 2020]: Wenn man auf dumme Tippfehler verzichtet, dann funktioniert auch beginDraw() mit dem with-Statement. Das korrigierte Code-Schnipsel sieht also nun so aus:

    with pg.beginDraw():
        pg.background(98, 199, 119, a)
        pg.fill(colors[i])
        pg.circle(x, y, 32)
    image(pg, 0, 0)

Im unten stehenden Komplettlisting habe ich die Korrekturen ebenfalls eingefügt.

Die Regenbogenfarben sind als eine Hommage an Daniel Shiffman mit der Coding Train Farbpalette erzeugt worden und die Farben wechseln alle 10 Frames.

Doch hier erst einmal der komplette Quellcode:

colors = [color(146, 82, 161), color(240, 99, 164), color(49, 197, 244),
          color(248, 239, 34), color(248, 158, 80), color(240, 80, 37),
          color(129, 122, 198)]
a = 10    # alpha

def setup():
    global t, i, pg
    size(640, 480)
    this.surface.setTitle("Perlin Noise Worm")
    pg = createGraphics(width, height)
    t = PVector(0, 10000)
    i = 0

def draw():
    global t, i, pg
    n1 = noise(t.x)
    n2 = noise(t.y)
    x = map(n1, 0, 1, 0, width)
    y = map(n2, 0, 1, 0, height)
    with pg.beginDraw():
        pg.background(98, 199, 119, a)
        pg.fill(colors[i])
        pg.circle(x, y, 32)
    image(pg, 0, 0)
    t.x += 0.01
    t.y += 0.01
    if frameCount%10 == 0:
        i += 1
        if i == len(colors):
            i = 0

Damit der Screenshot oben die Bewegungen des Wurms und seine Farbänderungen zeigt, habe ich beim semitransparenten Hintergrund a = alpha auf einen sehr niedrigen Wert (10) gesetzt. Dieser läßt den Verlauf des Wurms komplett durchscheinen. Wen das stört, ab etwa a = 100 überdeckt die Hintergrundfarbe nach einer kurzen Zeit die Spur des Wurms.

Ein ähnliches Processing (Java) Programm gibt es in Daniel Shiffmans Einleitung zu seinem Buch »The Nature of Code«. Da es ja eines meiner Corona-Isolations-Projekte ist, die Beispiele aus diesem Buch mithilfe der Arcade-Bibliothek nach Python zu portieren, sollte ich mal herausfinden, ob und wie die Arcade-Bibliothek alpha-Transparenz bei den Farben unterstützt. Still digging!


(Kommentieren) 

image image



Über …

Der Schockwellenreiter ist seit dem 24. April 2000 das Weblog digitale Kritzelheft von Jörg Kantel (Neuköllner, EDV-Leiter Rentner, Autor, Netzaktivist und Hundesportler — Reihenfolge rein zufällig). Hier steht, was mir gefällt. Wem es nicht gefällt, der braucht ja nicht mitzulesen. Wer aber mitliest, ist herzlich willkommen und eingeladen, mitzudiskutieren!

Alle eigenen Inhalte des Schockwellenreiters stehen unter einer Creative-Commons-Lizenz, jedoch können fremde Inhalte (speziell Videos, Photos und sonstige Bilder) unter einer anderen Lizenz stehen.

Der Besuch dieser Webseite wird aktuell von der Piwik Webanalyse erfaßt. Hier können Sie der Erfassung widersprechen.

Diese Seite verwendet keine Cookies. Warum auch? Was allerdings die iframes von Amazon, YouTube und Co. machen, entzieht sich meiner Kenntnis.


Werbung

Diese Spalte wurde absichtlich leergelassen!


Werbung


image  image  image
image  image  image


image