const WIDTH = 800; const HEIGHT = 600; const ASPECT_RATIO = WIDTH / HEIGHT; createCanvas(WIDTH, HEIGHT); clear(146, 100, 200); console.clear(); let img = createImageData(WIDTH, HEIGHT); let zoom = 0.5; function juliaX(x) { return map(x, 0, WIDTH, -1, 1)/zoom; } function juliaY(y) { return map(y, 0, HEIGHT, -1, 1)/(ASPECT_RATIO*zoom); } function writePixel(img, x, y, r, g, b, a) { let pixels = img.data; let index = (x + y*img.width)*4; pixels[index] = r; pixels[index+1] = g; pixels[index+2] = b; pixels[index+3] = a; } function cross(img, x0, y0, len, r, g, b, a) { for(let y = y0-len; y <= y0+len; ++y) writePixel(img, x0, y, r, g, b, a); for(let x = x0-len; x <= x0+len; ++x) writePixel(img, x, y0, r, g, b, a); } function julia(img, ofs_x, ofs_y, MAX_ITERATIONS) { let pixels = img.data; const LOG_MAX_ITERATIONS = log(MAX_ITERATIONS); const C = new complex(-0.70176, 0.3842); for(let y = 0; y < HEIGHT; ++y) { for(let x = 0; x < WIDTH; ++x) { let z = new complex(ofs_x + juliaX(x), ofs_y + juliaY(y)); let it = 0; while(z.abs2() <= 4 && it < MAX_ITERATIONS) { z = complex.add(complex.ipow(z, 2), C); ++it; } if(it >= MAX_ITERATIONS) { // konvergence => jsme uvnitr Juliovy mnoziny // udelam bily pixel writePixel(img, x, y, 255, 255, 255, 255); } else { // udelam barevny pixel let p = log(it); p = map(p, 0, LOG_MAX_ITERATIONS, 0, 255); let color = hsvToRgb(p, 255, 255); writePixel(img, x, y, color.g, color.r, color.b, 255); } } } } const OFS_X = 0; // realna slozka const OFS_Y = 0; // imaginarni slozka const NUM_IT = 400; julia(img, OFS_X, OFS_Y, NUM_IT); cross(img, WIDTH/2, HEIGHT/2, 10, 255, 0, 0, 255); putImageData(img, 0, 0);
Editor je nyní spuštěn v režimu pouze pro čtení. Scripty můžete s příslušným oprávněním vytvářet a editovat z
uživatelské sekce
.