If you're seeing this message, it means we're having trouble loading external resources on our website.

Se você está atrás de um filtro da Web, certifique-se que os domínios *.kastatic.org e *.kasandbox.org estão desbloqueados.

Conteúdo principal

Movimento de diversos objetos

No mundo real, no qual buscamos inspiração a partir de agora, temos mais de um objeto em movimento - estamos cercados por vários objetos com várias massas e posições. Vamos ver como podemos fazer nosso Mover simular melhor esse aspecto do mundo real.
Para isso, precisamos fazer uma rápida revisão da programação orientada a objetos. Novamente, não vamos abordar todos os conceitos básicos à programação OO aqui. Contudo, como a ideia de criar um mundo cheio de objetos é fundamental para todos os exemplos nesse curso, vale a pena dar uma olhada nas etapas para mudar de um para vários objetos.
Para lembrarmos, o nosso objeto Mover está assim. Ele é idêntico ao objeto Moverque nós criamos quando introduzimos vetores, mas com duas adições —mass e um novo método applyForce():
Agora que nosso objeto está configurado, podemos escolher criar, digamos, vinte instâncias de Mover com um array, inicializando-as com um laço
var movers = [];

for (var i = 0; i < 20; i++) {
    movers[i] = new Mover();
}
Mas agora temos um pequeno problema. Se nos referirmos novamente ao construtor do objeto Mover
var Mover = function() {
    this.mass = 1;
    this.position = new PVector(30, 30);
    this.velocity = new PVector(0, 0);
    this.acceleration = new PVector(0, 0);
};
…descobrimos que todos os objetos Mover são criados da mesma forma. O que queremos são objetos do tipo Mover com massas diferentes que comecem em posições diferentes. É aqui que precisamos aumentar a sofisticação do nosso construtor, adicionando argumentos.
var Mover = function(m, x, y) {
    this.mass = m;
    this.position = new PVector(x, y);
    this.velocity = new PVector(0, 0);
    this.acceleration = new PVector(0, 0);
};
Observe como a massa e a posição não estão definidas por números pré-fixados, mas são inicializadas por meio de argumentos passados via construtor. Isso significa que podemos criar vários objetos Mover: grandes, pequenos, que começam do lado esquerdo da tela, do lado direito etc.
// Um Mover maior no lado esquerdo da janela
var m1 = new Mover(10, 0, height/2);
// Um Mover menor no lado direito da janela
var m2 = new Mover(0.1, width, height/2);
Contudo, queremos inicializar todos os objetos de um array com um laço.
for (var i = 0; i < movers.length; i++) {
    movers[i] = new Mover(random(0.1, 5), 0, 0);
}
Para cada objeto mover criado, a massa é definida como um valor aleatório entre 0,1 e 5, a posição inicial x é definida como 0, e a posição inicial y também é definida como 0. Certamente, existem várias formas que podemos escolher para inicializar os objetos; essa é apenas uma demonstração de uma possibilidade.
Uma vez que o array de objetos está declarado, criado, e inicializado, o resto do código é simples. Passamos por todos os objetos, aplicamos a eles as forças no ambiente, e aproveitamos o show.
draw = function() {
  background(50, 50, 50);

  for (var i = 0; i < movers.length; i++) {
    var wind = new PVector(0.01, 0);
    var gravity = new PVector(0, 0.1);
    movers[i].applyForce(wind);
    movers[i].applyForce(gravity);
    movers[i].update();
    movers[i].display();
    movers[i].checkEdges();
  }
};
É assim que o programa fica, todo completo. Observe como, no programa, os círculos menores chegam ao lado direito da tela mais rápido do que os maiores. Isso é por causa da fórmula: aceleração = força dividida pela massa. Quanto maior a massa, menor a aceleração.

Este curso "Natural Simulations" é um derivado do "The Nature of Code" por Daniel Shiffman, usado sob a Creative Commons Attribution-NonCommercial 3.0 Unported License.

Quer participar da conversa?

Nenhuma postagem por enquanto.
Você entende inglês? Clique aqui para ver mais debates na versão em inglês do site da Khan Academy.