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

Atração mútua

Espero que tenha sido útil termos começado com um cenário simples—um objeto atrai outro objeto—e seguido para um objeto atrai muitos objetos. No entanto, é provável que você vá se encontrar em uma situação um pouco mais complexa: muitos objetos se atraem entre si. Em outras palavras, cada objeto em um dado sistema atrai qualquer outro objeto nesse sistema (exceto a si mesmo).
Já fizemos a maior parte do trabalho para isso. Vamos considerar um programa com um array de objetos do tipo Mover:
var movers = [];

for (var i = 0; i < movers.length; i++) {
    movers[i] = new Mover(random(0.1, 2), random(width), random(height));
}

draw = function() {
    background(255, 255, 255);
    for (var i = 0; i < movers.length; i++) {
        movers[i].update();
        movers[i].display();
    }
};
A função draw() é onde precisamos fazer uma mágica. Atualmente, estamos dizendo: “para cada mover de índice i, seja atualizado e exibido.” Agora o que precisamos dizer é: “para cada mover de índice i, seja atraído por qualquer outro mover de índice j, e seja atualizado e exibido.”
for (var i = 0; i < movers.length; i++) {
    // Para cada Mover, verifique cada Mover!
    for (var j = 0; j < movers.length; j++) {
        var force = movers[j].calculateAttraction(movers[i]);
        movers[i].applyForce(force);
    }

    movers[i].update();
    movers[i].display();
}
No exemplo anterior, nós tínhamos um objeto Attractor com um método chamado calculateAttraction(). Agora, como nós temos movers atraindo movers, tudo o que precisamos fazer é copiar esse método para dentro do objeto Mover.
Mover.prototype.calculateAttraction = function(m) {
  var force = PVector.sub(this.position, m.position);
  var distance = force.mag();
  distance = constrain(distance, 5.0, 25.0);                        
  force.normalize();

  var strength = (G * this.mass * m.mass) / (distance * distance);
  force.mult(strength);
  return force;
};
Claro, há um pequeno problema. Quando estamos olhando para cada mover i e cada mover j, está tudo certo com as vezes em que i é igual a j? Por exemplo, o mover #3 deveria atrair o próprio mover #3? A resposta, naturalmente, é não. Se há cinco objetos, nós queremos que o mover #3 atraia os objetos 0, 1, 2 e 4, pulando ele mesmo. No entanto, nós queremos calcular e aplicar tanto a força do mover #3 no mover #1, quanto a força do mover #1 no mover #3. As forças calculadas serão as mesmas para o par, mas a aceleração resultante será diferente dependendo da massa de cada mover. Nossa tabela de atração deve ser assim:
0 ⇢ 1, 2, 3, 4
1 ⇢ 0, 2, 3, 4
2 ⇢ 0, 1, 3, 4
3 ⇢ 0, 1, 2, 4
Então, terminamos esse exemplo modificando nosso laço for para que o laço interno evite que os objetos atraiam a si mesmos:
for (var i = 0; i < movers.length; i++) {
    for (var j = 0; j < movers.length; j++) {
       if (i !== j) {
         var force = movers[j].calculateAttraction(movers[i]);
         movers[i].applyForce(force);
       }
    }

    movers[i].update();
    movers[i].display();
}
Agora, vamos juntar tudo:

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.