Dies ist eine Portierung des Projekts https://github.com/bbcmicrobit/micropython/blob/master/examples/flame_simulation.py für MakeCode und den Calliope mini. Die Variablen- und Methodennamen habe ich größtenteils beibehalten. Auch der Algorithmus ist derselbe, nun aber in JavaScript programmiert und mit einer Erklärung, was da eigentlich passiert, denn genau das hatte mich auch interessiert :-)
Computerprogramme, die ein Feuer simulieren, gibt es schon seit vielen Jahren und auf allen möglichen Systemen, z. B. in Spielen und Demos. Das Schöne ist: das ist relativ einfach und sieht trotzdem ziemlich realistisch aus.
Das Prinzip ist immer gleich: in der untersten Bildschirmzeile wird quasi das Feuer gelegt, mit zufälligen Werten, die einer unterschiedlichen Helligkeit entsprechen. Dann "wandert" das Feuer immer weiter nach oben. Gleichzeitig wird unten mit neuen Zufallswerten "nachgelegt". In dem man Durchschnittswerte zwischen dem bisherigen Bild und dem neuen berechnet, wird eine fließende Animation daraus.
In diesem Algorithmus funktioniert das so: Zunächst ist der Bildschirm leer. Die Startwerte für das Feuer werden für jede Bildschirmspalte ausgewürfelt (hier: 4, 6, 6, 3, 2). Dies ist nicht Teil des Bildschirms, sondern einfach in einer Variablen gespeichert:
Dann werden diese Werte quasi in die unterste Bildschirmzeile "geschoben", aber nicht von jetzt auf gleich, sondern schrittweise. Wie viele Schritte es sind, das ist einstellbar; je mehr Schritte, desto fließender die Animation. Im Folgenden habe ich einmal vier Schritte genommen:
Im Bild oben war die bisherige unterste Bildschirmzeile (0, 0, 0, 0, 0) zunächst mit 100 % gewichtet, die neuen Werte darunter (4, 6, 6, 3, 2) mit 0 %. Im ersten Schritt wird die bisherige unterste Bildschirmzeile mit 75 % gewichtet, die neuen Werte mit 25 %. So fängt das Feuer ganz langsam an zu lodern (1, 1, 1, 0, 0). Im nächsten Schritt sind die alten und neuen Werte jeweils mit 50 % gewichtet, da kommt (2, 3, 3, 1, 1) raus, das Feuer wird stärker. Im nächsten Bild ist das Verhältnis 25 % zu 75 %, das Feuer wird noch stärker. Im letzten Schritt sind es 0 % zu 100 %, das hießt die bisherige unterste Bildschirmzeile (0, 0, 0, 0, 0) ist verschwunden und entsprecht nun komplett den neuen Werten (4, 6, 6, 3, 2):
Was jetzt kommt, ist immer das selbe: unten kommen immer neue Zufallswerte, die mit dem bisherigen Bild gemittelt werden, wobei die Gewichtung der neuen Werte immer mehr gesteigert wird. So wandert das Feuer weiter nach oben. In Excel kann man das sehr schön mit "bedingter Formatierung" nachstellen:
Und nach diesem Prinzip geht es immer so weiter, bis der Mini ausgeschaltet wird. Wenn man die Zwischenschritte nicht machen würde, wäre nur die ganz rechte Spalte im Bild oben relevant: Immer neue Zeilen mit Zufallswerten: (2, 8, 8, 2, 6), dann (2, 5, 2, 8, 3), dann (4, 4, 4, 8, 2), dann (5, 4, 3, 8. 8), werden von unten ins Bild "geschoben". Das wäre dann der Algorithmus in seiner gröbsten aber einfachsten Form.
Hier ist es nicht dargestellt, weil sich so die Werte besser nachvollziehen lassen, aber im Programm passiert noch etwas: Es wird quasi eine "Maske" über das Bild gelegt, die dafür sorgt, dass das Feuer zum Rand und nach oben hin "gedimmt" wird. So sieht es noch realistischer aus. Die Geschwindigkeit der Animation ist über eine Variable einstellbar.
Wenn man das Programm einfach so auf dem Calliope laufen lässt, kann man das Flackern schon ganz gut sehen, am besten ist es aber, wenn man eine durchsichtige Mülltüte über das Display legt. Diese manuelle Glättung lässt ein "Feuer" aus nur 25 Pixeln ziemlich echt wirken. So unglaublich gut ist unser Gehirn im Erkennen von Mustern! Ein Künstler, der diese Tatsache immer wieder sehr eindrucksvoll ausnutzt, ist der Amerikaner Jim Campbell:
Das Programm im Anhang ist nicht weiter kommentiert, sollte aber mit den vorangegangenen Erläuterungen gut verstehbar sein - einige Programmiererfahrung allerdings vorausgesetzt. Und wer nur die Animation genießen will, kann es einfach in die Zwischenablage kopieren, in MakeCode in der JavaScript-Ansicht einfügen und sofort starten, am besten aber nicht nur im Simulator, sondern auf dem Mini. Viel Spaß :-)



Comments