https://www.youtube.com/watch?v=hYf9cQ1U6F0&feature=youtu.be
Tuesday, February 2, 2016
Trabalho de Matemática Aplicada a Multimídia - Parte 2
Video referente a segunda parte do trabalho de Matemática Aplicada a Multimidia.
https://www.youtube.com/watch?v=hYf9cQ1U6F0&feature=youtu.be
https://www.youtube.com/watch?v=hYf9cQ1U6F0&feature=youtu.be
Monday, February 1, 2016
Atividade - Análise da Palestra "The Beauty of Data Visualization"
David McCandless inicia a palestra com a premissa de que estamos sofrendo com o excesso de informações e abundância de dados ultimamente. Além disso, o palestrante levanta diversas questões sobre a utilização dos dados e informações.
A informações precisam manter um contexto, a informação precisa contar uma estória, de forma que foquemos atenção apenas no que é importante, ver o acesso das informações com outros olhos, selecionarmos o que consideramos relevantes.
Se utilizando de algumas metáforas e exemplos, David McCandless foca na importância que os dados e as informações que temos acesso constroem nosso conhecimento em sociedade, o mesmo chega a comparar os dados ao próprio solo, é a base de tudo que temos acesso recentemente. O mundo das informações é extenso, e se você souber selecionar e focar no que lhe é interessante, você pode aprender muitas coisas interessantes.
Portanto, o acesso a informação é o excesso de dados não é necessariamente algo ruim, eles estão ao nosso favor, contanto que seja filtrados e selecionados de forma adequada. A informação que fica é o conhecimento, isso é o válido, a forma que os dados mudam e constrói o pensamento humano.
Atividade - Tangente
A partir do estudo sobre tangentes em sala, foi proposta a atividade de criar um olho composto por um círculo grande braco com um circulo menor preto dentro que seguisse o cursor do mouse.
Código Gerado:
float tg;
void setup(){
size(600,600);
}
void draw(){
background(0);
if(!(mouseX == 0)){
tg = 180+(180/PI*((atan2(300-mouseY,300-mouseX))));
}
fill(255);
ellipse(300,300,140,140); //Ellipse maior.
stroke(0);
fill(0);
ellipse(45*cos(radians(tg))+300,45*sin(radians(tg))+300,50,50);
println(tg);
}
Código Gerado:
float tg;
void setup(){
size(600,600);
}
void draw(){
background(0);
if(!(mouseX == 0)){
tg = 180+(180/PI*((atan2(300-mouseY,300-mouseX))));
}
fill(255);
ellipse(300,300,140,140); //Ellipse maior.
stroke(0);
fill(0);
ellipse(45*cos(radians(tg))+300,45*sin(radians(tg))+300,50,50);
println(tg);
}
Resultado:
Atividade - Polígonos Regulares
A atividade consiste em criar uma aplicação que cria um polígino regular a partir da quantidade de lados informados pelo o usuários através de uma variável e discutir a solução. A solução mais adequada pra essa aplicação é criar variáveis que utilizam senos e cossenos para a criação dos pontos do polígno e outras que guardam os valores dos ângulos.
Código Gerado:
int l = 8; //variável que recebe o valor dos lados escolhidos
float ang1 = 360/l;
float ang2 = (360/l)*2;
float r = 100; //raio
float PX1; //posições dos pontos
float PY1; //posições dos pontos
float PX2; //posições dos pontos
float PY2; //posições dos pontos
float soma = 360/l;
void setup(){
background(255);
size(600,600);
}
void draw(){
poligonoRegular();
informacoes();
}
//desenho do poligno
void poligonoRegular(){
PX1 = height/2 + cos(radians(ang1))*r;
PY1 = height/2 + sin(radians(ang1))*r;
PX2 = height/2 + cos(radians(ang2))*r;
PY2 = height/2 + sin(radians(ang2))*r;
line(PX1, PY1, PX2, PY2);
ang1 = ang1 + soma;
ang2 = ang2 + soma;
}
//procedimento que exibe as informações selecionados pelo o usuário
void informacoes(){
fill(0);
textSize(30);
text("Número de lados:" + l, 100, 50);
}
Resultados:
Código Gerado:
int l = 8; //variável que recebe o valor dos lados escolhidos
float ang1 = 360/l;
float ang2 = (360/l)*2;
float r = 100; //raio
float PX1; //posições dos pontos
float PY1; //posições dos pontos
float PX2; //posições dos pontos
float PY2; //posições dos pontos
float soma = 360/l;
void setup(){
background(255);
size(600,600);
}
void draw(){
poligonoRegular();
informacoes();
}
//desenho do poligno
void poligonoRegular(){
PX1 = height/2 + cos(radians(ang1))*r;
PY1 = height/2 + sin(radians(ang1))*r;
PX2 = height/2 + cos(radians(ang2))*r;
PY2 = height/2 + sin(radians(ang2))*r;
line(PX1, PY1, PX2, PY2);
ang1 = ang1 + soma;
ang2 = ang2 + soma;
}
//procedimento que exibe as informações selecionados pelo o usuário
void informacoes(){
fill(0);
textSize(30);
text("Número de lados:" + l, 100, 50);
}
Resultados:
Atividade - Barquinho
Com base nos estudos de trigonometria, foi proposto em sala a atividade de criar um barquinho e o movimento do mesmo no mar.
Código gerado:
//variáveis utilizadas na formação da onda e do barquinho
int onda;
float x ;
float y;
// configurações da tela e da formação da onda
void setup(){
size(800,600);
frameRate(60);
if (width >= height){
onda = width/80;
}
else {
onda = height/60;
}
}
//desenho do barco e suas implementação
void Barco(){
y=(1+sin(radians(x)))*20+height/2-4*onda;
x+=1;
if (x >= width){
x = 5;
}
stroke(0);
line(x,y,x,y-3*onda);
fill(255);
triangle(x,y-onda/2,x-2*onda,y-onda/2,x,y-3*onda);
fill(98,81,81);
quad(x-1*onda,y+onda,x-2*onda,y,x+2*onda,y,x+1*onda,y+onda);
}
// procedimento que recebe as configurações do mar
void Mar(){
float xMar= 0; .
float yMar= height/2;
noStroke();
fill(89,220,245);
rect(0,yMar+onda,width,yMar+onda);
for (int i=0; i <= width;i++){
yMar=(1+sin(radians(xMar)))*20+height/2;
if (!(xMar >= width)){
xMar+=1;
}
triangle(xMar,yMar-onda/2,xMar-2*onda,yMar-onda/2,xMar+2,yMar-3*onda);
stroke(89,220,245);
rect(xMar,yMar-onda,2*onda,2*onda);
}
}
void draw(){
background(250,209,3);
Mar();
Barco();
}
Código gerado:
//variáveis utilizadas na formação da onda e do barquinho
int onda;
float x ;
float y;
// configurações da tela e da formação da onda
void setup(){
size(800,600);
frameRate(60);
if (width >= height){
onda = width/80;
}
else {
onda = height/60;
}
}
//desenho do barco e suas implementação
void Barco(){
y=(1+sin(radians(x)))*20+height/2-4*onda;
x+=1;
if (x >= width){
x = 5;
}
stroke(0);
line(x,y,x,y-3*onda);
fill(255);
triangle(x,y-onda/2,x-2*onda,y-onda/2,x,y-3*onda);
fill(98,81,81);
quad(x-1*onda,y+onda,x-2*onda,y,x+2*onda,y,x+1*onda,y+onda);
}
// procedimento que recebe as configurações do mar
void Mar(){
float xMar= 0; .
float yMar= height/2;
noStroke();
fill(89,220,245);
rect(0,yMar+onda,width,yMar+onda);
for (int i=0; i <= width;i++){
yMar=(1+sin(radians(xMar)))*20+height/2;
if (!(xMar >= width)){
xMar+=1;
}
triangle(xMar,yMar-onda/2,xMar-2*onda,yMar-onda/2,xMar+2,yMar-3*onda);
stroke(89,220,245);
rect(xMar,yMar-onda,2*onda,2*onda);
}
}
void draw(){
background(250,209,3);
Mar();
Barco();
}
Resultado:
Atividade - Cronômetro
A atividade proposta foi criar um cronômetro a partir da utilização dos cálculos de coordenadas polares para determinar o ponteiro dos segundos.
Código gerado:
float angulo = PI/2;
float diametro = 300;
float intervalo = 1000;
float raio = 150;
float relog;
float x;
float y;
int segundos;
void setup(){
size(600,600);
background(89,184,245);
}
//execução do ponteiro e dos segundos
void draw(){
if(millis() > relog + intervalo){
relog = millis();
polar();
}
}
//desenho do relógio
void polar(){
background(255,0,0);
stroke(255);
fill(0,0,255);
ellipse(300,300,diametro,diametro);
y = diametro - sin(angulo)*raio;
x = diametro + cos(angulo)*raio;
angulo -= 2*PI/60;
line(300,300,x,y);
segundos++;
}
Resultado:
Código gerado:
float angulo = PI/2;
float diametro = 300;
float intervalo = 1000;
float raio = 150;
float relog;
float x;
float y;
int segundos;
void setup(){
size(600,600);
background(89,184,245);
}
//execução do ponteiro e dos segundos
void draw(){
if(millis() > relog + intervalo){
relog = millis();
polar();
}
}
//desenho do relógio
void polar(){
background(255,0,0);
stroke(255);
fill(0,0,255);
ellipse(300,300,diametro,diametro);
y = diametro - sin(angulo)*raio;
x = diametro + cos(angulo)*raio;
angulo -= 2*PI/60;
line(300,300,x,y);
segundos++;
}
Resultado:
Atividade - Knob
A atividade proposta para casa consiste em criar uma aplicação que simula o funcionamento de um efeito knob, baseados nos códigos de efeito Fade In e Fade Out, realizando um efeito de dissolve em duas imagens de acordo com a posição vertical do mouse.
Código:
PImage imgGaga, imgDeus;
float OpaMax, OpaMin;
float r,g,b,r2,g2,b2;
int pos;
void setup(){
size(320,240);
imgGaga = loadImage("ladygaga.jpg");
imgDeus = loadImage("deus.jpg");
}
void draw(){
loadPixels();
OpaMax = float(mouseY)/240;
OpaMin = 1 - OpaMax;
for(int x = 0; x<320; x++){
for(int y = 0; y<240; y++){
pos = y * 320 + x;
r = OpaMax * red(imgGaga.pixels[pos]);
g = OpaMax * green(imgGaga.pixels[pos]);
b = OpaMax * blue(imgGaga.pixels[pos]);
r2 = OpaMin * red(imgDeus.pixels[pos]);
g2 = OpaMin * green(imgDeus.pixels[pos]);
b2 = OpaMin * blue(imgDeus.pixels[pos]);
pixels[pos] = color(r+r2, g+g2, b+b2);
}
}
updatePixels();
}
Resultados:
Atividade - Relações de Filtro e Contraste
A atividade proposta foi discutir as definições de filtro e contraste de uma imagem de acordo com uma variável.
Código de execução:
void setup(){
size(640, 240);
PImage imgOriginal = loadImage("original.jpg"); //imagem original
PImage imgContraste = createImage(imgOriginal.width, imgOriginal.height, RGB); //cópia que recebe o efeito.
arraycopy(imgOriginal.pixels, imgContraste.pixels);
float inicio = 127.5;
float contraste = 0.5; //variável que define o valor do contraste aplicado
loadPixels();
for(int i=0; i<imgOriginal.width * imgOriginal.height; i++){
int r = imgContraste.pixels[i] >> 16 & 0xFF;
int g = imgContraste.pixels[i] >> 8 & 0xFF;
int b = imgContraste.pixels[i] & 0xFF;
int a = imgContraste.pixels[i] >> 24 & 0xFF;
//variável vermelho
r = int(r*(1.0 + (contraste)*((r-inicio)*.01)));
r = constrain(r, 0, 255);
//variável verde
g = int(g*(1.0 + (contraste)*((g-inicio)*.01)));
g = constrain(g, 0, 255);
//variável azul
b = int(b*(1.0 + (contraste)*((b-inicio))*.01));
b = constrain(b, 0, 255);
imgContraste.pixels[i] = (a << 24) | (r << 16) | (g << 8) | b;
}
//criação das imagens
image(imgOriginal, 0, 0);
image(imgContraste, width/2, 0);
}
Código de execução:
void setup(){
size(640, 240);
PImage imgOriginal = loadImage("original.jpg"); //imagem original
PImage imgContraste = createImage(imgOriginal.width, imgOriginal.height, RGB); //cópia que recebe o efeito.
arraycopy(imgOriginal.pixels, imgContraste.pixels);
float inicio = 127.5;
float contraste = 0.5; //variável que define o valor do contraste aplicado
loadPixels();
for(int i=0; i<imgOriginal.width * imgOriginal.height; i++){
int r = imgContraste.pixels[i] >> 16 & 0xFF;
int g = imgContraste.pixels[i] >> 8 & 0xFF;
int b = imgContraste.pixels[i] & 0xFF;
int a = imgContraste.pixels[i] >> 24 & 0xFF;
//variável vermelho
r = int(r*(1.0 + (contraste)*((r-inicio)*.01)));
r = constrain(r, 0, 255);
//variável verde
g = int(g*(1.0 + (contraste)*((g-inicio)*.01)));
g = constrain(g, 0, 255);
//variável azul
b = int(b*(1.0 + (contraste)*((b-inicio))*.01));
b = constrain(b, 0, 255);
imgContraste.pixels[i] = (a << 24) | (r << 16) | (g << 8) | b;
}
//criação das imagens
image(imgOriginal, 0, 0);
image(imgContraste, width/2, 0);
}
Atividade - Tileset
Durante foi proposto a criação de tileset, utilizando arquivos PGN, através do código em linguagem processing a seguir:
PImage imgGrama, imgMuro, imgSombra;
int[][] mapa = { {0,0,0,0,0,0,0,0},
{0,1,1,1,1,1,2,0},
{0,1,0,0,0,1,2,0},
{0,1,0,0,0,1,2,0},
{0,1,0,0,0,1,2,0},
{0,1,0,0,0,1,2,0},
{0,1,0,0,0,1,2,0},
{0,0,0,0,0,0,0,0} };
void setup(){
size(256,256);
imgGrama = loadImage("grama.png");
imgMuro = loadImage("muro.png");
imgSombra = loadImage("sombra.png");
for(int i=0; i<8; i++){
for(int j=0; j<8; j++){
switch(mapa[j][i]){
case 0: image(imgGrama, i*32, j*32);
break;
case 1: image(imgMuro, i*32, j*32);
break;
case 2: image(imgSombra, i*32, j*32);
break;
}
}
}
}
O resultado obtido foi:
Atividade Proposta:
A atividade proposta para casa foi discutir a criação de um mapa a partir de um tileset isométrico. O procedimento é bem simples, consiste na substituição dos tilesets retangulares utilizados anteriormente, por tilesets em formatos de losango, a fim de representar um modelo 3D de uma forma menos complexa.
Exemplo:
Cada tile representado no mapa possui uma coordenada (X,Y) especifica, que vai ser definida nos loops de posicionamento de cada um.
Portanto, nota-se que a posição dos tiles deve ser dada pelo centro, e não forma de costume. Pequenos detalhes nas coordenadas X e Y contribuem para uma criação melhor do mapa a partir da divisão por dois altura, multiplicada pela subtração dos indices X e Y.
Subscribe to:
Posts (Atom)