Mandelbrot und Apfelmännchen
« | 15 Jan 2022 | »Für meine Framebuffer Experimente brauchte irgend eine “anschaubare” Grafikausgabe, und dabei fiel mir spontan wieder das Apfelmännchen ein.
Dieses mathematisch errechnete Farbenspiel aus der Mandelbrot-Menge tauchte und taucht in Schulen immer wieder als Programmierbeispiel auf.
Und heute freue ich mich, dass ich diesen Code auch wieder mal sinnvoll “recyclen” kann.
Der Code, den wir in Schulen zu Gesicht bekommen, sieht in etwa so aus:
1typedef struct 2{ 3 unsigned char r; 4 unsigned char g; 5 unsigned char b; 6} rgb_t; 7 8void set_pixel(int x, int y, rgb_t const* color); 9 10void mandelbrot_render() 11{ 12 rgb_t color; 13 int width = 640; 14 int height = 480; 15 int ix, iy, count; 16 double x, y, qx, qy, temp; 17 double xmin = -2; 18 double xmax = 1; 19 double ymin = -1; 20 double ymax = 1; 21 22 for(ix = 0; ix < width; ix++) 23 { 24 for(iy = 0; iy < height; iy++) 25 { 26 x = (double)ix / (double)width * (xmax - xmin) + xmin; 27 y = (double)iy / (double)height * (ymax - ymin) + ymin; 28 count = 0; 29 qx = x; 30 qy = y; 31 while((count < 256) && ((qx * qx + qy * qy) < 4)) 32 { 33 count++; 34 temp = 2.0 * qx * qy + y; 35 qx = qx * qx - qy * qy + x; 36 qy = temp; 37 } 38 39 color.r = 256 - (count * 4) % 256; 40 color.g = 256 - (count * 16) % 256; 41 color.b = count % 256; 42 set_pixel(ix, iy, &color); 43 } 44 } 45}
Gerechnet wird im Fensterbereich (-2, -1)-(+1, +1)
und abgebildet auf eine
RGB-Farbfläche von 640 x 480
Pixel. Und dabei sieht man das bekannte
Haupt-Apfelmännchen.
Wenn man nun in das Bild hineinzoomt (also xmin,ymin
vergrößert und
xmax,ymax
verkleinert), werden an den Farbübergängen interessante Strukturen
sichtbar.
Das kann man beliebig tief tun und man wird dabei immer auf ähnliche Strukturen in unterschiedlicher Verzerrung stoßen und vor allem das Apfelmännchen wird man in kleineren Varianten ebenso immer wieder mal antreffen.
Fazit
Für Grafik-Tests könnte man natürlich auch ein Foto laden und anzeigen,
aber mir gefällt die Vorstellung, dass alles aus dem Code heraus generiert
wird.
Außerdem beeindruckt mich der verblüffend einfache Code, der solch ansehnliche
Bilder malen kann.
Früher (um 2000) in der Schule nutzten wir das alte Turbo Pascal
unter DOS und
setzten 16 Farben auf 640x480 Pixel oder sogar 256 Farben im
Mode X (320x200 Pixel) ein.
Heute dient mir das Beispiel als Vergleich, ob meine WinAPI, XLIB,
OpenGL und uEFI-GOP
Framebuffer-Implementierungen auch immer “gleich” aussehen.
(Manchmal verwechselte ich z.B. RGB und BGR, was die Farbpalette verdrehte.)
Und mit ein paar Zoom- und Move-Faktoren im Code lässt sich mit Mausklicks
und Pfeiltasten ganz passabel durch so ein Apfelmännchen durchnavigieren.
Der Code ist nun im Demo-Projekt gateframes
verewigt.