Mandelbrotova množina

Mandelbrotova množina v JavaScriptu od Drahomíra Hanáka

by drahos

HTML

<canvas id="platno" width="450" height="450"></canvas>

CSS

#platno { background: #000; }

JavaScript

(function( $ ) {

    window.MandelbrotovaMnozina = function() {
        
        // Soukromé proměnné
        var platno = this.platno = $('#platno').get(0);
        var kontext = platno.getContext('2d');
        var width = platno.width, 
            height = platno.height;
            
        // Vytvoříme si objekt imageData, kde budou data o jednotlivých pixelech
        this.imageData = kontext.createImageData(width, height);
        this.maxinter = 20;
        
        // Funkce nastaví barvu pro daný pixel 
        this.nastavPixel = function(x, y, r, g, b, a) {
            var index = (x + y * this.imageData.width) * 4;
            // Hodnota červené bervy
            this.imageData.data[index+0] = r;
            // Hodnota zelené barvy
            this.imageData.data[index+1] = g;
            // Hodnota modré barvy
            this.imageData.data[index+2] = b;
            // Alfa kanál (průhlednost)
            this.imageData.data[index+3] = a;
        };
        
        // Funkce vykreslí Mandelbrotovu množinu
        this.vykresli = function( xCenter, yCenter, zoom ) {
            // Uloží zoom
            $(platno).data('zoom', zoom);
            // Vytvoří nová image data
            this.imageData = kontext.createImageData(width, height);
            
            // Potřebné proměnné
            var count, zr, zi, zr2, zi2;
            var zoom = zoom > 1 ? zoom*3 : zoom;
            var minY = yCenter - (1.5/(zoom));
            var maxY = yCenter + (1.5/(zoom));
            var minX = xCenter - (1.5/(zoom));
            var maxX = xCenter + (1.5/(zoom));
            var dx = (maxX - minX) / width;
            var dy = (maxY - minY) / height;
            var rX = 0, rY = 0;
            
            // Projdeme všechny pixely na plátně
            for(var y = minY; y < maxY; y += dy) {
                rY++;
                var rX = 0;
                for (var x = minX; x < maxX && rX < width; x += dx) {
                    rX++;
                  ...