Conteúdo principal
Curso: Programação > Unidade 5
Lição 4: Vetores- Introdução aos vetores
- Mais matemática de vetores
- Magnitude e normalização de vetores
- Movimento de vetores
- Funções estáticas vs. métodos de instância
- Movimento interativo de vetor
- Desafio: Rastreador de mouse
- Projeto: Criaturas computacionais
© 2024 Khan AcademyTermos de usoPolítica de privacidadeAviso de cookies
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.
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)
.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:
- Calcule um vetor que aponte do objeto para o local de destino (mouse)
- Normalize esse vetor (reduzindo seu comprimento para 1)
- Dimensione esse vetor para um valor adequado (multiplicando-o por algum valor)
- 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?
- 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)