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 interativo de vetor

Para terminar esta seção, vamos tentar algo um pouco mais complexo e muito mais útil. Vamos calcular de maneira dinâmica a aceleração de um objeto de acordo com um regra estabelecida no Algoritmo nº 3 — o objeto acelera em direção ao mouse.
Diagrama do vetor de aceleração do mouse
Toda vez que quisermos calcular um vetor com base em uma regra ou uma fórmula, precisamos calcular duas coisas: magnitude e direção. Vamos começar com direção. Sabemos que o vetor de aceleração deve apontar da posição do objeto para a posição do mouse. Let’s say the object is located at the point (x,y) and the mouse at (mouseX,mouseY).
Diagrama de dx, dy
Nesse diagrama, vemos que podemos obter um vetor (dx,dy) subtraindo a posição do objeto da posição do mouse.:
  • dx = mouseX - x
  • dy = mouseY - y
Vamos reescrever o que está acima utilizando a sintaxe PVector. Supondo que estamos na definição do objeto Mover e temos acesso à posição PVector do objeto, então temos:
var mouse = new PVector(mouseX, mouseY);
// Veja! Estamos usando o sub() estático porque queremos um PVector completamente novo
var dir = PVector.sub(mouse, location);
Agora temos um PVector que aponta da posição do objeto para o mouse. Se o objeto fosse realmente acelerar usando esse vetor, ele apareceria instantaneamente na posição do mouse. É claro que isto não torna a animação boa, e o que queremos fazer agora é decidir com que velocidade esse objeto deve acelerar em direção ao mouse.
Para definir a magnitude (qualquer que seja ela) de nosso PVector que representa a aceleração, precisamos primeiramente ___ esse vetor de direção. É isso mesmo. Normalizar. Se podemos diminuir o vetor até seu vetor unitário (de comprimento um), então temos um vetor que nos indica a direção e que pode facilmente ser dimensionado para qualquer valor. Um multiplicado por qualquer coisa é igual a qualquer coisa.
var anything = ??;
dir.normalize();
dir.mult(anything);
Para resumir, seguimos as seguintes etapas:
  1. Calcule um vetor que aponte do objeto para o local de destino (mouse)
  2. Normalize esse vetor (reduzindo seu comprimento para 1)
  3. Dimensione esse vetor para um valor adequado (multiplicando-o por algum valor)
  4. Atribua esse valor à aceleração
É assim que o programa fica depois da implementação dessas etapas:
Você pode estar se perguntando por que o círculo não para quando atinge o destino. É importante observar que o objeto em movimento não tem conhecimento sobre a tentativa de parar em um destino; ele apenas sabe onde é o destino e tenta ir para lá o mais rápido possível. Ir o mais rápido possível significa que ele, inevitavelmente, vai ultrapassar o local e vai ter que voltar, novamente indo o mais rápido possível em direção ao destino, ultrapassando-o novamente, e assim por diante. Fique atento; em seções posteriores vamos aprender como programar um objeto para chegar em um local (vá com calma).
Este exemplo é notavelmente próximo ao conceito de atração gravitacional (na qual o objeto é atraído para a posição do mouse). A atração gravitacional será abordada de modo mais detalhado na próxima seção. No entanto, a única coisa que está faltando aqui é que a força da gravidade (magnitude da aceleração) é inversamente proporcional à distância. Isto significa que quanto mais perto o objeto está do mouse, mais rápido ele acelera.
Vamos ver como ficaria este exemplo com uma array de movers (ao invés de apenas um).

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?

  • Avatar blobby green style do usuário Fernanda Furletti
    Olá, alguém pode me ajudar a passar do "Desafio: Rastreador de mouse"? Está muito difícil e não achei explicação.
    Hello, can anyone help me pass the "Challenge: Mouse Tracker"? It's very difficult and I can not explain it.
    (2 votos)
    Avatar Default Khan Academy avatar do usuário
Você entende inglês? Clique aqui para ver mais debates na versão em inglês do site da Khan Academy.