terça-feira, 14 de abril de 2015

M.A.M.I. Trabalho 01: Análise matemática de uma obra artística ou peça de design e aplicação do conceito.

O Conjunto de Mandelbrot
É basicamente um fractal definido como um conjunto de pontos c no plano complexo para o qual a sucessão definida recursivamente:

z_0 = 0\,
z_{n+1} = {z_n}^2 + c
não tende ao infinito.
Para cada ponto c do plano complexo, a sequência se expande como:
c=x+iy \,
Z_0=0 \,
\begin{matrix}Z_1&=&Z_0^2+c \\ \ &=& x+iy\end{matrix} \,
\begin{matrix}Z_2&=&Z_1^2+c \\ \ 
&=&(x + iy)^2+x+iy \\ \ 
&=&x^2+2ixy-y^2+x+iy \\ \ &=&x^2-y^2+x+(2xy+y)i\end{matrix} \,
Z_3=Z_2^2+c=... \,
e assim por diante.

Escolha da análise matemática envolvida:
Decidi focar o conceito de "recursividade" envolvido para recriar uma aplicação baseada nele, que agisse de maneira similar ao Conjunto de Mandelbrot, em outras palavras, o uso de Fractais.
- Conceito de recursividade: É um termo usado de maneira mais geral para descrever o processo de repetição de um objeto de um jeito similar ao que já fora mostrado. Um bom exemplo disso são as imagens repetidas que aparecem quando dois espelhos são apontados um para o outro. Em ciência da computação, a recursividade é a definição de uma subrotina (função ou método) que pode invocar a si mesma. Um exemplo de aplicação da recursividade pode ser encontrado nos analisadores sintáticos recursivos para linguagens de programação. A grande vantagem da recursão está na possibilidade de usar um programa de computador finito para definir, analisar ou produzir um estoque potencialmente infinito de sentenças, designs ou outros dados.
- Conceito de Fractal:É um objeto geométrico que pode ser dividido em partes, cada uma das quais semelhante ao objeto original. Diz-se que os fractais têm infinitos detalhes, são geralmente autossimilares e independem de escala. Em muitos casos um fractal pode ser gerado por um padrão repetido, tipicamente um processo recorrente ou iterativo.
Então, baseado nestas definições, a aplicação a ser criada deverá ser um fractal gerado por uma função que chama a si mesma sucessivamente, gerando na tela, sob uma certa condição, uma repetição do mesmo efeito.

O livro "The Nature of Code", de Daniel Shiffman, fala sobre a implementação de diversos fractais.

Site com exemplos de fractais:http://andrew-hoyer.com/experiments/fractals/
 
Fontes: site Wikipédia
The Nature of Code(Shiffman, Daniel.)

Aplicação:
A função criada, no momento que o mouse é pressionado. gera um círculo central, com outros círculos menores a sua volta, e dependendo da direção que o mouse é arrastado irão gerar mais ou menos imagens correspondentes.

Código:

//Fractal com recursividade
boolean mousePressed = false;
void setup() {
  size(800,500);
}

void mousePressed() {
  mousePressed = !mousePressed; //Alterna o valor da variável mousePressed entre true e false
}

void draw() {
  background(255);
  drawCircle(mouseX, mouseY, 200);
}

void drawCircle(float x, float y, float radius) {
  fill(255);
  //Desenha elipse
  ellipse(x, y, radius, radius); //Desenha uma elipse central 
  if (radius > 8) { //Enquanto radius não for menor do que 8 executa recursivamente o método drawCircle
    drawCircle(x + radius/2, y, radius/2 - ((mousePressed ? mouseY : mouseX) * 0.1)); //Desenha uma elipse
                                                            // na borda direita do círculo central com
                                                            // o tamanho sendo:
                                                            //   (metade do radius do círculo original)
                                                            // - (10% da posição X ou posiçao Y do mouse)
    drawCircle(x - radius/2, y, radius/2); //Desenha uma elipse na borda esquerda do círculo central
    drawCircle(x, y + radius/2, radius/2); //Desenha um círculo na parte superior do círculo central
    drawCircle(x, y - radius/2, radius/2); //Desenha um circulo na parte inferior do círculo central
  }
  drawMousePosition(); //Mostra a posiçao X e Y atual do mouse
}

void drawMousePosition() {
  fill(0);
  text("Posiçao X do mouse = " + mouseX + "", 10, 15);
  text("Posiçao Y do mouse = " + mouseY + "", 10, 30);
}

Resultados:




Nenhum comentário:

Postar um comentário