Mandelbrot und Apfelmännchen

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 Progammierbeispiel 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.

Mandelbrot 1

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.

Mandelbrot 2

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.

Mandelbrot 3

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.