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:

reenconcavo_2015-1

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:

triangulos_carpenter0002 triangulos_carpenter0001 triangulos_carpenter0003 triangulos_carpenter0004 triangulos_carpenter0005 triangulos_carpenter0006 triangulos_carpenter0007 triangulos_carpenter0008 triangulos_carpenter0009 triangulos_carpenter0010 triangulos_carpenter0011 triangulos_carpenter0012 triangulos_carpenter0013 triangulos_carpenter0014 triangulos_carpenter0015 triangulos_carpenter0016 triangulos_carpenter0017 triangulos_carpenter0018 triangulos_carpenter0019 triangulos_carpenter0020 triangulos_carpenter0021 triangulos_carpenter0022 triangulos_carpenter0023 triangulos_carpenter0024 triangulos_carpenter0025 triangulos_carpenter0026 triangulos_carpenter0027 triangulos_carpenter0028 triangulos_carpenter0029 triangulos_carpenter0030 triangulos_carpenter0031