Carpenter
Boa Vista, Roraima – 22 de outubro de 2015
Fractais são estruturas que repetem o todo em suas partes.
Para a recepção de calouros de 2015.1 do CAHL-UFRB escolhemos o conceito de fractais para fazer o cartaz de chamada do evento. Aproveitei um código que eu já havia feito em Processing inspirado no algoritmo que Loren Carpenter descreve nesse documentário:
Logo depois que vi esse documentário, há uns dois anos, fui correndo para o computador implementar um algoritmo parecido com o que Carpenter descreve em palavras, que utilizou para a primeira cena totalmente sintetizada em computador exibida na TV, a cena de Marte no seriado Jornada nas Estrelas. O código utiliza a idéia que Carpenter descreve de desenhar triângulos dentro de triângulos. A diferença é que em vez de utilizar o espaço tridimensional para levantar essa estrutura transformando em montanhas eu apenas desenhei os triângulos num plano bidimensional, alterando as cores de preenchimento desses triângulos.
O resultado no cartaz foi esse:
Esse é o código que fiz para Processing (baixe o Processing em http://processing.org):
float numIteracoes=20;
float faixa=255;
boolean cor = true;
boolean preenchimento = true;
boolean fundo = false;
boolean randomico = true;
float r1, r2, r3;
float iteracao;
float matiz;
int[] cores;
int triangN=0;
void setup () {
size (800, 800);
background(0);
colorMode(HSB);
noCursor();
cores = new int[2000000];
for (int i=0; i<2000000; i++) {
cores[i]=int(255*random(1));
}
}
void draw () {
if (fundo) {
background(0);
}
stroke(255);
numIteracoes = 10*mouseX/float(width);
triangN=0;
triangulos (-width/2.0, 0, 1.5*width, 0, width/2.0, 2*height, 0);
}
void triangulos (float p1X, float p1Y,
float p2X, float p2Y,
float p3X, float p3Y, int c) {
if (mousePressed) {
faixa = 255*mouseY/float(height);
}
if (randomico) {
matiz = random(1)*faixa + 255*mouseY/float(height);
} else {
matiz = cores[triangN];
}
if (matiz > 255) {
matiz -= 255;
}
iteracao = (1-c/numIteracoes);
if (preenchimento) {
noStroke();
if (cor) {
fill(matiz, 255, 255, 255*iteracao);
}
else {
fill(matiz, 255*iteracao);
}
}
else {
noFill();
if (cor) {
stroke(matiz, 255, 255, 255*iteracao);
}
else {
stroke(matiz, 255*iteracao);
}
}
triangle (p1X, p1Y, p2X, p2Y, p3X, p3Y);
triangN++;
if (randomico) {
r1 = random(1);
r2 = random(1);
r3 = random(1);
} else {
r1 = mouseY/float(height);
r2 = r1;
r3 = r2;
}
float pp1X = r1*p1X + (1-r1)*p2X;
float pp1Y = r1*p1Y + (1-r1)*p2Y;
float pp2X = r2*p2X + (1-r2)*p3X;
float pp2Y = r2*p2Y + (1-r2)*p3Y;
float pp3X = r3*p3X + (1-r3)*p1X;
float pp3Y = r3*p3Y + (1-r3)*p1Y;
if (c < numIteracoes) {
c+=1;
triangulos (pp1X, pp1Y, pp2X, pp2Y, pp3X, pp3Y, c);
triangulos (p1X, p1Y, pp1X, pp1Y, pp3X, pp3Y, c);
triangulos (p2X, p2Y, pp2X, pp2Y, pp1X, pp1Y, c);
triangulos (p3X, p3Y, pp3X, pp3Y, pp2X, pp2Y, c);
}
noCursor();
}
void mouseMoved () {
cursor();
}
void keyPressed () {
if (key == ‘c’ || key == ‘C’) {
cor = !cor;
}
if (key == ‘p’ || key == ‘P’) {
preenchimento = !preenchimento;
}
if (key == ‘f’ || key == ‘F’) {
fundo = !fundo;
}
if (key == ‘r’ || key == ‘R’) {
randomico = !randomico;
for (int i=0; i<2000000; i++) {
cores[i]=int(255*random(1));
}
}
if (key == ‘s’ || key == ‘S’) {
save(“triangulos_carpenter.png”);
}
}
Com o mouse e algumas teclas podemos modificar os parâmetros dos desenhos que o código faz. Executei o código e escolhi a imagem do cartaz entre essas que foram geradas: