18 de jan. de 2017

Física Dinâmica básica em uma aplicação JavaFX

Sabe o que é bacana? Programar para se divertir. Algumas das melhores formas de se fazer isso é criando jogos, como o Pong, ou brincando com a natureza, como mostra o livro Nature Of Code.
Nessa postagem iremos mostrar os primeiros capítulos desse livro aplicados em um mundo JavaFX. O que iremos mostar:

  • Gravidade
  • Aplicando outras forças

Claro que o mundo da física e da matemática são muito maiores do que isso, mas espero que a atual aplicação inspire o leitor a criar as suas próprias coisas.


Sobre a app de teste


o modelo de nossa aplicação é o já tão conhecido Canvas com uma engine: O Canvas é uma tela de desenho, para desenharmos nele continuamente usamos uma Timeline, o famoso loop.

As coisas desenhadas em um canvas precisam de um X e Y e dentro do loop atualizamos o x e o y de acordo com os acontecimentos e com a entrada do usuário. Para mantermos referëncias aos valores de X e Y, usamos uma classe do JavaFX chamada javafx.geometry.Point2D.

Tendo isso em mente, vamos entender alguns conceitos usados na nossa aplicação.

Conceitos


Vetor: Um vetor na nossa aplicação é uma posicação X e Y, sendo que a direção do vetor dependerá dos sinais X e Y. Na matemática o vetor é um pouco diferente, mas as ideias são semelhantes 
Velocidade: É a variação da posição de um corpo no espaço em um dado período. No nosso código a velocidade se aplica continuamente a posição do corpo na execução do loop da aplicação;
Aceleração: É a variação da velocidade com o passar do tempo, que, no nosso caso, é determinado também pelo loop;
Massa: É a quantidade de matéria que tem um corpo.

Pois bem, na nossa aplicação o corpo é definido por uma bolinha. Aplicando os conceitos acima, o que temos é uma bolinha parada no meio da tela. Veja:


Muito sem graça, né? Nada acontece, feijoada, com essa aplicação. O motivo é só um, não há forças aplicadas sobre o corpo. Mas o que é uma força. De acordo com Isaac Newton, força é qualquer agente externo que modifica o movimento de um corpo livre ou causa deformação num corpo fixo.  Não, não estamos falando da força dos Jedi...
Na verdade, uma força está sendo aplicada sobre o seu corpo nesse exato momento: a Gravidade. A gravidade te puxa para o centro da terra e é por isso que estamos sempre no chão. A nossa bolinha ali em cima está parada, não tem gravidade no mundo dos pixels. E com essa aplicação sem graça, nós já podemos entender a primeira lei de Newton: um corpo em repouso permanece em repouso e um corpo em movimento permanece em movimento a menos que sofra efeito de alguma força. Ou seja, essa bolinha está parada aí e é aí que ela vai ficar, exceto se tiver alguma força que faça ela se mover!
Podemos agora modificar nosso programa para mudar isso, podemos aplicar um vetor de gravidade na bolinha.  Importante dizer que limitamos a bolinha as bordas da aplicação, assim, toda vez que a bolinha chega nas bordas da tela, simplesmente invertemos a direção do vetor de velocidade.

O vetor de gravidade "puxa pra baixo", logo, ele precisa ter um X=0 e um Y positivo, vamos colocar 0.1. O resultado é uma bolinha feliz pulando:



Que bacana, né? Agora vamos colocar outra força: o vento. O vento é uma força simples de se colocar e  vamos dizer que o vento bata da esquerda para a direita, precisamos de um vetor que tenha essa direção(X=algum número positivo, Y=0). O resultado é como se segue:


Note que a bolinha agora fica indo para o canto, bate na "parede" e quando vai voltar, o vento não a deixa!

Notem que até agora não falamos da massa. Pois bem, a bolinha tem uma massa e de acordo com essa massa, a força é modificada, afinal, se bate um vento no seu quarto algumas coisas leves (um copo de plástico, por exemplo) pode voar, mas não o seu computador e nem você e isso acontece por que as coisas têm massa diferente. Para visualizar isso, colocamos mais 5 bolinhas na tela com massas diferentes. Veja o resultado:



A aplicação de forças deve respeitar a segunda lei de Newton que definiu a fórmula que diz que força é igual massa vezes aceleração. Ao aplicarmos a força no código, dividimos ela pela massa e adicionamos à aceleração.

No vídeo abaixo você vai notar que a velocidade das bolinhas é diferente e isso acontece por causa da massa delas. Como o vento é constante, tudo acaba se movendo, mas isso muda quando adicionamos a força de fricção (atrito, ótima explicação pode ser encontrada nesse vídeo). A fricção faz com que haja a perda de movimento de acordo com o tempo, logo, o que acontece uns segundos após rodar a aplicação com o adicional da fricção é o seguinte:



Vou parar por aqui pois o livro mencionado no início do post tem quase 500 páginas e daria pra continuar aplicando os conceitos em JavaFX até o livro terminar. Veja um pequeno vídeo da aplicação mostrada acima


Conclusão


Falamos um pouco sobre física e também programamos. Quem sabe um dia as aulas nas escolas brasileiras não serão assim? Minha missão foi concluída se você está lendo essa linha empolgado e até considerando fazer seus testes localmente. Claro que o que esboçamos é um exemplo muito simples e trata os conceitos de forma muito superficial, mas, mesmo assim, é muito interessante ver isso em ação.

O código total da aplicação pode ser encontrado nosso github.


Um comentário: