ASCII Apfelmännchen

Hier mal zur Kurzweil eine Implementierung eines zoombaren Apfelmännches in ASCII-Art:


Bedienung
In das Bild klicken und halten, um näher heranzuzoomen und dabei den Ausschnitt zu bewegen Shift-Klick zoomt die Ansicht wieder heraus

Für alle die sich für den Source interessieren – hier ist er:

<script language="javascript">
var cw = 180;         // Anzahl Spalten in der Anzeige
var ch = 80;          // Anzahl Zeilen in der Anzeige
var centerX = -0.5;   // Position der Mitte der Anzeige
var centerY = 0;      // Position der Mitte der Anzeige
var width = 2.5;      // Angezeigte Breite des Fraktals
var height = 2;       // Angezeigte Höhe des Fraktals
var eHeight, eWidth;  // Höhe und Breite des Anzeigeelements
var mouseX, mouseY;   // Aktuelle Mausposition relativ zum Anzeigeelement

/*************************************************************************************************

Die Mandelbrotmenge - kurz, einfach und schnell

Fangen wir mit der zugrunde liegenden Formel an:

Zn+1 = Zn^2 + c

Bei Z und c handelt es sich um komplexe Zahlen der Form a+b*i wobei gilt: i^2 = -1

Da komplexe Zahlen aus zwei Teilen - dem reellen und dem imaginären Teil - bestehen, eignen
sie sich hervorragend als 2D Koordinaten.

Die Konstante c nehmen wir als x,y Koordinate für den Start der rekursiven Formel. 

Das Quadrat bilden wir durch das Ausmultiplizieren der komplexen Zahl:
(ar+ai*i)*(br+bi*i) = ar*br+ai*i*br+ar*bi*i+ai*bi*i*i
                    = ar*br + ai*br*i + ar*bi*i - ai*bi     (da i*i = -1 laut Definition)
                    = (ar*br - ai*bi) + (ai*br + ar*bi)*i
                    
Beginnend mit Z=(0,0), wird die oben genannte Formel nun immer wieder auf sich selbst
(rekursiv) angewandt bis die maximale Anzahl Rekursionen erreicht ist, oder erkannt wurde,
dass der Wert gegen unendlich strebt. Letzteres ist dann der Fall, wenn Zn*Zn+Zi*Zi>2 ist.

Je nach Anzahl der Rekursionen die durchgeführt wurden, wird eine Helligkeitsstufe für den
aktuellen Punkt verwendet - dazu werden die Standard-ASCII Zeichen mit zunehmender "Schwärzung"
bzw. Pixelabdeckung verwendet.
**************************************************************************************************/
function renderMandelbrot(element, cols, rows, cx, cy, width, height) {
    var code=".`-_':,;^=+|)<>)iv%xclrs{*}I?!][1taeo7zjLunT#JCwfy325Fp6mqSghVd4EgXPGZbYkOA&8U$@KHDBWNMR0Q";
    var cr, ci;
    var x,y;
    var row,col;
    var nr,ni;
    var mr,mi;
    var num;
    var maxDepth = 60;
    var line;
    var content = "";
    for(row=0 ; row<rows ; row++) {
        line="";
        for(col=0 ; col<cols ; col++) {
            cr = (col/cols - 0.5)*width  + cx;
            ci = (row/rows - 0.5)*height + cy;
            
            nr=0;
            ni=0;
            num=0;
            while(num<maxDepth) {
                mr = nr*nr - ni*ni + cr;
                mi = ni*nr + nr*ni + ci;
                nr = mr;
                ni = mi;
                
                num++;
                
                if(nr*nr+ni*ni>2)
                    break; // Strebt gegen unendlich - abbruch
            }
            
            pos = Math.floor(num*code.length/maxDepth); 
            if(pos>=0 && pos