Conteúdo principal
Programação
Curso: Programação > Unidade 5
Lição 5: Forças- Leis de movimento de Newton
- Desafio: Balão flutuante
- Movimento de diversos objetos
- Modelando a gravidade e o atrito
- Resistência do ar e dos fluidos
- Atração gravitacional
- Desafio: Gerador de arte
- Atração mútua
- Projeto: Ameaças e benefícios para a criatura
© 2023 Khan AcademyTermos de usoPolítica de privacidadeAviso de cookies
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
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.