1 2 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));                    
        });
    }
}); | 
Partager