ATV 13
- Marcos André
- 19 de jun. de 2016
- 2 min de leitura
"Criar o movimento de um barco no mar e discutir os resultados no blog"
Para a realização da tarefa, criei um array que armazena as alturas da onda, e desenhei o barquinho na altura correspondente.Como meu barco é uma imagem, realizei a importação da imagem e translação para o centro da imagem.
A rotação natural do barco, é dado pelo angulo da reta tangente com o eixo x da função sen(x).Isso é obtido, derivando a função seno, que resulta cos(x).Para se obter o ângulo, utilizamos a função inversa à inclinação encontrada.O problema é aplicar isso no processing. Por sorte um colega já havia feito e a partir do código, tentei adaptar à minha função seno.Para rotacionar a minha imagem,tive que realizar a translação para o centro desta e aplicar a função rotate().Os resultados não foram muito satisfatórios, mas mantive a tentativa no código.
Para conferir um efeito interessante, adicionei um valor aleatório na função que calcula as alturas da onda gerando um efeito de ruído.

Segue o código e vídeo abaixo:
int espacamentoX = 2; // Espaçamento horizontal da onda. int w; // Comprimento da onda. float Angulo = 0.0; // Angulo inicial float amplitude = 80.0; // Amplitude da onda float periodo = 370.0; // periodo de repetição da onda float dx; // Valor que incrementa 'x' float[] yvalues; // Array que armazena as alturas das ondas. float ang=0; PImage boat; float y=0; void desenhaBarco(float x,float y){ pushMatrix(); translate(width/2-boat.width/2,height/2-boat.height/2); rotate(asin(cos(radians(width/2+frameCount)*1))/4);//Rotação para o barquinho. image(boat,0,y+30); popMatrix();
}
void setup() { boat = loadImage("boat.png"); size(640, 360); w = width+16; dx = (TWO_PI / periodo) * espacamentoX; yvalues = new float[w/espacamentoX]; boat.resize(100,100);
}
void draw() { for (float n = 0; n <= height; n++) { stroke(170, 255, map(n, 0, height, 50, 255)); line(0, n, width, n); }
background(180,180,255);
calculaOnda(); desenhaOndas(); desenhaBarco(200,y); }
void calculaOnda() { Angulo += 0.02;
float x = Angulo; for (int i = 0; i < yvalues.length; i++) { yvalues[i] = sin(x)*amplitude+int(random(1,5));//O valor aleatório gera o 'noise' das ondas. x+=dx; } }
void desenhaOndas() { noStroke(); fill(60,60,200);
for (int x = 0; x < yvalues.length; x++) { y = yvalues[x]-60; ellipse(x*espacamentoX, 220+yvalues[x], 10,
//As diferentes ondas, em diferentes valores de y
fill(30,30,110); ellipse(x*espacamentoX, 200+yvalues[x], 20, 30); fill(60,60,210); ellipse(x*espacamentoX, 250+yvalues[x], 10, 20); fill(50,50,170); ellipse(x*espacamentoX, 300+yvalues[x], 20, 30); fill(50,50,150); ellipse(x*espacamentoX, 350+yvalues[x], 30, 40); } }
Comments