Olá pessoal. Tudo certo?!
Outro dia, escrevi um post mostrando como gerar fractais a partir do Mandelbrot Set. Hoje, faço o mesmo trabalho apresentando Julia set.
Novamente, foco apenas na implementação em Javascript. Uma boa explicação teórica sobre Julia set pode ser encontrada na Wikipedia ou no MathWorld.
Importante: Reaproveitei boa parte do código que escrevi na implementação de Mandelbrot set. Por isso, não é descrita nesse post. Para saber mais sobre a porção de código que não explico (como a interface com o usuário) recomendo ler o post indicado.
Código-fonte completo está disponível em https://gist.github.com/1395850.
Aceitando parâmetros pela Querystring
De forma geral, podemos assumir que a implementação para Julia Set é bem similar a implementação para Mandelbrot Set. Uma diferença notável, entretanto, é que podemos definir o valor da constante complexa definida em sua equação base. De forma abstrada, defino essa constante c como c = p + qi. Onde qi é um número complexo. Na implementação de hoje, permito que o usuário informe o valor dessas duas constantes na Querystring. Observe:
var qs = new Array()
var vars = location.search.replace(/\x3F/, "").replace(/\x2B/g, " ").split("&")
if (vars != "") {
for (i = 0; i < vars.length; i++) {
nvar = vars[i].split("=")
qs[nvar[0]] = unescape(nvar[1])
}
}
function QueryString(key) {
return qs[key]
}
$("#presets").buttonset();
var seed = {
p: parseFloat(QueryString("p")),
q: parseFloat(QueryString("q"))
};
Nosso objeto Julia
Toda a implementação para o desenho do Julia set está “isolada” em um único objeto. Observe:
Julia = {
qmin: -2.0,
qmax: 2.0,
pmin: -2.0,
pmax: 2.0,
reset: function () {
with (Julia) {
qmin = -2.0;
qmax = 2.0;
pmin = -2.0;
pmax = 2.0;
}
},
compute: function () {
juliaImage = context.getImageData(0, 0, canvasWidth, canvasHeight);
juliaPixels = juliaImage.data;
var a = canvasWidth, b = canvasHeight, kmax = 200, m = 4;
var x0, y0, dx, dy, x, y, r;
dx = (Julia.qmax - Julia.qmin) / (a - 1); dy = (Julia.pmax - Julia.pmin) / (b - 1);
for (var sx = 0; sx <= a; sx++) {
for (var sy = 0; sy <= b; sy++) {
k = 0;
x0 = Julia.qmin + sx * dx; y0 = Julia.pmin + sy * dy;
r = 0;
while ((k++ <= kmax) && (r m) {
if (k 255) k = 255;
drawPixel(sx, sy, k);
} else {
drawPixel(sx, sy, 0);
}
}
}
context.putImageData(juliaImage, 0, 0);
}
};
Alguns exemplos para Julia Set
Para encerrar, gostaria de mostrar alguns fractais gerados a partir de Julia Set.
Comecemos definindo p = -0.74543 e q = 0.11301.
Live demo: http://users.cjb.net/livedemoelemarjr/julia.htm?p=-0.74543&q=0.11301
Ampliando uma região do fractal:
Agora, p = -0.285 e q = 0.01
Live demo: http://users.cjb.net/livedemoelemarjr/julia.htm?p=0.285&q=0.01
Ampliando uma região:
Agora, p = -0.835 e q = -0.2321
Live demo: http://users.cjb.net/livedemoelemarjr/julia.htm?p=-0.835&q=-0.2321
Ampliando uma região:
Era isso!
![]()



Publicado em 26/11/2011
0