Stranger Than Usual

Kleines Kunstprojekt: PeerPressure

Ich habe neulich einen Blogpost zu Creative Coding gelesen. Der Post ist eine Einführung für Anfänger, wie man mit ziemlich wenig Code schon interessante Bilder erzeugen kann. Das hat mich motiviert, auch mal wieder aktiv zu werden und ein simples Programm zu schreiben, das mir schon länger im Kopf herumschwebt.

Im Prinzip ist das Programm ein einfacher zellulärer Automat, aber randomisiert. Die Wahrscheinlichkeit, dass Zelle im nächsten Schritt einen bestimmten Zustand hat, ist proportional zur Anzahl der benachbarten Zellen (inklusive der Zelle selbst), die in diesem Zustand sind. Beispiel: Eine schwarze Zelle mit vier schwarzen und vier weißen Nachbarn hat eine Wahrscheinlichkeit von 5/9, im nächsten Schritt schwarz zu sein und 4/9, weiß zu sein. Eine schwarze Zelle, die komplett von schwarzen Zellen umgeben ist, bleibt demnach auf jeden Fall schwarz.

Wenn der Anfangszustand so ist:

Die rechte Seite des Bildes ist schwarz, die linke Hälfte ist weiß, die Trennlinie ist scharf

…dann kann es nach 100 Schritten zum Beispiel so aussehen:

Die rechte Seite des Bildes ist schwarz, die linke Hälfte weiß, es gibt keine klare Trennlinie mehr.

…und nach 99999 Schritten so:

Überall im Bild gibt es schwarze und weiße Flächen die Trennlinien dazwischen sind unscharf. Insgesamt sind die schwarzen Flächen größer

Es hat mich etwa eine halbe Stunde gekostet, das grundlegende Programm dafür zu schreiben. Der Code ist auf Codeberg. Ich habe ein bisschen damit herumgespielt. Es hat etwa 80 Sekunden gedauert, 100.000 100.000 Schritte zu durchlaufen und für jeden Schritt ein PNG abzuspeichern. Das lässt sich sicher noch verbessern, aber ich sehe gerade nicht viel Sinn darin, denn der eigentliche Flaschenhals ist das Rendern eines Videos daraus. Denn eigentlich sieht das am Schönsten aus, wenn man sieht, wie es sich entwickelt. ffmpeg hat über 2,5 Stunden gebraucht, um aus den 100000 Bildern ein Video zu machen, und das ist nur ein 240p-Video (426×240).

Zudem gibt es in dem Video noch einige Kompressionsartefakte, die es unschön machen, es anzuschauen. Auch die Dateigröße ist ziemlich groß. Ich lade garantiert noch einmal ein Video dazu hoch, aber vorher muss ich ein bisschen mit Codecs und anderen Einstellungen herumprobieren. Vielleicht mache ich auch eine Version, in der ich vorher jedes Bild mit einem Gaußfilter glätte. Oder einen Zeitraffer, wo nur jeder 10. Zustand oder so ins Video kommt.

Fun Fact am Ende: Die 100.000 Bilder waren etwa 1,3 GiB groß. Mit optipng optimiert dann nur noch etwa 750 MiB. Mit zopflipng wäre das vermutlich noch ein bisschen weniger geworden, aber optipng, was schon recht schnell ist, hat mir schon zu lange gebraucht, mit Zopfli hätte das Stunden gedauert.