quarta-feira, 1 de junho de 2016

M.A.M.I. Trabalho 01 - 2016.1 - Gerador Automático de "Arte"

Jackson Pollock:

      Paul Jackson Pollcok(28 de janeiro de 1912 - 11 de agosto de 1956) foi um pintor norte-americano e referência no movimento do expressionismo abstrato.
      Suas obras possuíam um grau de "caos" ou desordem na estrutura das composições, que causavam efeitos ou resultados estéticos complexos. Ele utilizava um estilo de pintura próprio chamado drip painting, método pelo qual despejava quantidades de tinta líquida sobre a tela esticada no chão. Apesar da aparente confusão, o efeito de profundidade e movimento de padrões são inconfundíveis em seus trabalhos.

Alguns exemplo de quadros de Pollock: 




Vídeo explicando a natureza dos fractais de Pollock:

Fractais:

    Do latim fractus, fração, quebrado, são figuras da geometria não-Euclidiana.
      A geometria fractal é o ramo da matemática que estuda as propriedades e comportamento dos fractais. Descreve muitas situações que não podem ser explicadas facilmente pela geometria clássica, e foram aplicadas em ciência, tecnologia, e arte gerada por computador. As raízes conceituais dos fractais remontam as tentativas de medir o tamanho dos objetos para os quais as definições tradicionais baseadas na geometria Euclidiana falham.
      Um fractal mais comum é 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 de escala. Em muitos casos um fractal pode ser gerado por um padrão repetido, tipicamente um processo recorrente ou iterativo. Em outros casos ele pode ser uma composição de formas randômicas com tamanhos, posições e até cores aleatórios.
      O termo foi criado em 1975 por Benoît Mandelbrot, matemático francês nascido na Polônia, que descobriu a geometria fractal na década de 70 do século XX. Vários tipos de fractais foram originalmente estudados como objetos matemáticos, e atualmente são usados como elementos de peças artísticas.

Gerador de "Arte" baseado no trabalho de Pollock e na aleatoriedade dos Fractais:

      Softwares como o Processing possuem funções que simulam a aleatoriedade, os números randômicos, gerados pelo comando 'random()'. Tomado como base algumas obras de Pollock, desenvolvi uma aplicação que gera uma imagem composta de várias curvas, com tamanhos, posições e cores aleatórias. Uma imagem diferente cada vez que for rodado.

Exemplos:





Referências:

https://pt.wikipedia.org/wiki/Jackson_Pollock
http://navax.net.br/blog/?p=670 
https://pt.wikipedia.org/wiki/Fractal

Outros trabalhos artísticos com uso de fractais:

Grupo Fractarte - Galeria 

Código:


float interacoes = int(random(10));
float X = 0;
float Y = 0;
float raio = 0;
void setup() {
  size(600,600);
  background(random(255),random(255),random(255));
  for (int i = 0; i <= interacoes; i++){
    X = random(200,400);
    Y = random(200,400);
    raio = random(100,200);
    drawCircle(X, Y, raio);
  }
}

void drawCircle(float x, float y, float radius) {
  fill(random(255),random(255),random(255));
  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); //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
  }
   curve(random(x),random(y),random(x),random(y),random(x),random(y),random(x),random(y)); //Altera todos os círculos para curvas com tamanho, posições e cores randômicas
   curve(random(x,600),random(y,600),random(x,600),random(y,600),random(x,600),random(y,600),random(x,600),random(y,600));
   curve(random(x,600),random(y),random(x,600),random(y),random(x,600),random(y),random(x,600),random(y));
   curve(random(x),random(y,600),random(x),random(y,600),random(x),random(y,600),random(x),random(y,600));
 
}

    

quarta-feira, 24 de junho de 2015

Crossfade

Criar uma aplicação que realiza o crossfade entre 3 imagens de acordo com a posição vertical do mouse.

Imagens Usadas:

         


Código:

PImage img1;
PImage img2;
PImage img3;

float controle = 0.0;

void setup() {
  size(461, 539);
  img1 = loadImage("sora1.jpg");
  img2 = loadImage("sora2.jpg");
  img3 = loadImage("sora3.jpg");
}

void draw() {
  background(255);

  // controle varia de 1 ate 4
  controle = 3 * (mouseY/(float)height) + 1;

  float alpha;

  // controle entre 1.0 e 2.5 define o alpha da img1
  if (controle < 2.5) {
    alpha = (controle - 1.0)/1.5;
    alpha = 1.0 - alpha;
  } else {
    alpha = 0.0;
  }

  tint(255, alpha * 255);
  image(img1, 0, 0);

  // controle entre 1 e 4 define o alpha da img2
  alpha = abs(controle - 2.5)/1.5;
  alpha = 1.0 - alpha;

  tint(255, alpha * 255);
  image(img2, 0, 0);


  // controle entre 2.5 e 4 define o alpha da img3
  if (controle > 2.5) {
    alpha = (controle - 2.5)/1.5;
  } else {
    alpha = 0.0;
  }
   
  tint(255, alpha * 255);
  image(img3, 0, 0);

}

Resuldado:

 

terça-feira, 23 de junho de 2015

T02 - Vídeo tutorial sobre o T01 da disciplina de M.A.M.I.

Este é um vídeo tutorial explicando o que fiz no primeiro trabalho parcial da disciplina de Matemática Aplicada à Multimídia Interativa. Ele equivale ao segundo trabalho parcial da disciplina.

Link: https://youtu.be/jZkYpz3jCM0

quinta-feira, 18 de junho de 2015

Histograma

A aplicação seguinte mostra o histograma dos canais RGB (do azul ao vermelho) da imagem mostrada.

Imagem:
















Código:

int [] tons = new int[256];
PImage img;

void setup() {
  size(640, 480);
  int pos, t;
  img = loadImage("sora.jpg");
  for (int x = 0; x < 640; x++) {
    for (int y = 0; y < 480; y++) {
      pos = y*480 + x;
      t = (int)red(img.pixels[pos]);
      tons[t] = tons[t] + 1;
    }
  }
  int maior = tons[0];
  int tom = 0;
  for (int i =1; i<256 i="">
    if (tons[i]>maior) {
      maior = tons[i];
      tom = i;
    }
  }
    for (int i =0; i<256 i="">
    float tamanho = (tons[i]*height)/maior;
    fill(0);
    rect(i*2, height-tamanho, 2, height );
  }
}

Resultado:

Envelhecimento Digital

A aplicação seguinte mostra exemplos de envelhecimento digital de uma imagem, com adição de ruídos, amarelos e vermelhos.

Código:

PImage imgOriginal;
PImage imgCopia = createImage(320, 240, RGB);
PImage imgCopia2 = createImage(320, 240, RGB);
PImage imgCopia3 = createImage(320, 240, RGB);
float r;
float g;
float b;
float amarelo;
int vermelho;
int pos;

void setup() {
  size(1280, 240);
  imgOriginal = loadImage("imagem.jpg"); 
  for (int x = 0; x<320 i="" x="">
    for (int y = 0; y<240 i="" y="">
      pos = y*320+x;
      r = red(imgOriginal.pixels[pos]);
      g = green(imgOriginal.pixels[pos]);
      b = blue(imgOriginal.pixels[pos]);
      amarelo =40;
      vermelho = 40;
      float media = (r+g+b)/3;
      
      float ruido = random(-15, 15);
      imgCopia.pixels[pos] = color(media+ruido, media+ruido, media+ruido);
      imgCopia2.pixels[pos] = color(media+amarelo+ruido, media+amarelo+ruido, media-amarelo+ruido);
      imgCopia3.pixels[pos] = color(media+vermelho, media, media);
    }
  }
}

void draw() {
  image(imgOriginal, 0, 0); 
  image(imgCopia, 320, 0);
   image(imgCopia2, 640, 0);
 image(imgCopia3, 960, 0);
}

Resultado:

Ajustes de Imagem

A aplicação a seguir ajusta uma determinada imagem aplicando filtros como negativo, escalas de cinza e variação de brilho.

Código:

PImage imgOriginal;
PImage imgCopia = createImage(320, 240, RGB);
PImage imgCopia2 = createImage(320, 240, RGB);
PImage imgCopia3 = createImage(320, 240, RGB);
PImage imgCopia4 = createImage(320, 240, RGB);
PImage imgCopia5 = createImage(320, 240, RGB);
int pos;
float r, g, b;
float brilho;
float valor_do_brilho = -0.5;


void setup() {
  size(960, 480);

  imgOriginal = loadImage("original.jpg");
  for (int x = 0; x < 320; x++) {
    for (int y = 0; y < 240; y++) {
      pos = y * 320 + x;
      r = red (imgOriginal.pixels[pos])  ;
      g = green(imgOriginal.pixels[pos]) ;
      b = blue(imgOriginal.pixels[pos]) ;

      float media = (r + g + b)/3;
      float media2 = (0.3*r + 0.59*g + 0.11*b)/1;

      float complemento_Blue = 255 - b;
      float complemento_Green = 255 - g;
      float complemento_Red = 255 - r;

      color cor = color(r, g, b); 

      brilho = brightness(cor);
      brilho = brilho * valor_do_brilho;

      imgCopia.pixels[pos] = color(complemento_Red, complemento_Green, complemento_Blue);
      imgCopia2.pixels[pos] = color(r, g, b);
      imgCopia3.pixels[pos] = color(media, media, media);
      imgCopia4.pixels[pos] = color(media2, media2, media2);
      imgCopia5.pixels[pos] = color(r+brilho, g+brilho, b+brilho);
    }
  }
}

void draw() {
  image(imgCopia, 0, 0);
  image(imgCopia2, 320, 0);
  image(imgCopia3, 320+320, 0);
  image(imgCopia4, 0, 240);
  image(imgCopia5, 320, 240);
}

Resultado: