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
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 Mover
que 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çovar 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.