| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 
 | var width = 900,
    height = 600,
    r1 = -1.80,
    r2 = 1.80,
    i1 = -1.20,
    i2 = 1.20,
    rstep,
    istep,
    ctx,
    nmax,
    img,
    pix,
	julias = [
		[-0.726895347709114071439, 0.188887129043845954792, 1000],
		[-0.156844471694257101941, -0.649707745759247905171, 1000],
		[0.285, 0.013, 1000],
		[0.285, 0.01, 500],
		[0.3, 0.5, 200],
		[-0.414, -0.612, 500],
		[0.382, 0.147, 200],
		[0.284, -0.0122, 1000],
		[-0.0519, 0.688, 200],
		[-0.577, 0.478, 1000]
	],
	kr,
	ki,
    complexe = function(cr, ci){
        var zr = 0,
            zi = 0,
            zr_next,
            zi_next;
 
        for (var n = 1; n <= nmax; n++){
			if (n == 1){
				zr_next = cr;
				zi_next = ci;
			} else {
				zr_next = zr*zr - zi*zi + kr;
				zi_next = 2*zr*zi + ki;
			}
 
            if ((zr_next*zr_next + zi_next*zi_next) > 4){
                return n;
            }
 
            zr = zr_next;
            zi = zi_next;
        }
 
        return 0;
    },
    draw = function(rmin, imin, rmax, imax){
        rstep = (rmax - rmin) / width;
        istep = (imax - imin) / height;
 
        var t1 = new Date().getTime(),
            t2,
            z = -1,
            thr = Math.floor(nmax / 5),
            eThr,
            i,
            r,
            e;
 
        for(var y = 0; y < height; y++) {
            i = imin + y * istep;
            for(var x = 0; x < width; x++) {
                r = rmin + x * rstep;
                e = complexe(r, i);
                eThr = e/thr;
                if(e > 0) {
                    if(e <= thr) {
                        red = Math.floor(eThr * 255);
                        green = blue = 0;
                    } else {
                        e -= thr;
                        eThr = e/thr;
                        red = 255 - Math.floor(eThr * 25);
                        green = Math.floor(eThr * 255);
                        blue = Math.floor(eThr * 127.5);
                    }
                } else {
                    red = green = blue = 0;
                }
                pix[z += 1] = red;
                pix[z += 1] = green;
                pix[z += 1] = blue;
                z += 1;
            }
        }
        ctx.putImageData(img, 0, 0);
        t2 = new Date().getTime();
        return t2 - t1;
    };
 
$(function(){
    var thisLeft = $("#canvas").offset().left,
        thisTop = $("#canvas").offset().top,
        affiche = function(r1, r2, i1, i2, ms){
            $("#coords").html("r1 = " + r1.toExponential(16) +
                              " | r2 = " + r2.toExponential(16) +
                              "<br>i1 = " + i1.toExponential(16) +
                              " | i2 = " + i2.toExponential(16) +
                              " | ms = " + ms);
        },
        nbIter = function(){
            var n = parseInt($("#maxIter").val(), 10);
 
            if (isNaN(n)){
                $("#maxIter").val(50);
                n = 50;
            } else if (n > 8000) {
                n = 8000;
            } else if (n < 20){
                n = 20;
            }
 
            return n;
        },
        zoom = function(){
            var z = parseInt($("#zoom").val(), 10);
 
            if (isNaN(z)) {
                $("#zoom").val(5);
                z = 5;
            } else if (z > 20) {
                z = 20;
            } else if (z < 1){
                z = 1;
            }
 
            return z;
        },
		coefs = function(){
			var kn = $("#coefs").val();
			kr = julias[kn][0];
			ki = julias[kn][1];
			$("#maxIter").val(julias[kn][2]);
		};
 
 
    if ($("#canvas")[0].getContext){
        ctx = $("#canvas")[0].getContext("2d");
        ctx.fillStyle = "#000000";
        ctx.fillRect(0, 0, width-1, height-1);
        img = ctx.getImageData(0, 0, width, height);
        pix = img.data;
		coefs();
        nmax = nbIter();
        affiche(r1, r2, i1, i2, draw(r1, i1, r2, i2));                    
 
		$("#coefs").change(function(){
			coefs();
			nmax = nbIter();
			$("#zoom").val(5);
			r1 = -1.80;
			r2 = 1.80;
			i1 = -1.20;
			i2 = 1.20;
            affiche(r1, r2, i1, i2, draw(r1, i1, r2, i2));                    
		});
 
        $("#canvas").click(function(event){                    
            var x = event.pageX - thisLeft,
                y = event.pageY - thisTop,
                z = zoom(),
                w = width/(2*z),
                h = height/(2*z),
                r = r1,
                i = i1;
 
            r1 = r + (x - w) * rstep;
            i1 = i + (y - h) * istep;
            r2 = r + (x + w) * rstep;
            i2 = i + (y + h) * istep;
            nmax = nbIter();
            affiche(r1, r2, i1, i2, draw(r1, i1, r2, i2));                    
        });
    }
}); |