Jason,
Em vez de ter três atributos de objeto,
- Posição do ponto (x, y)
- Direção Vector2D (x, y)
- Int velocidade
geralmente é muito mais fácil combinar a direção e a velocidade em um vetor de velocidade. Então você tem apenas dois atributos,
- Posição do ponto (x, y)
- Velocidade do vetor 2D (x, y)
Atualizando posição
Quando você precisa atualizar a posição do objeto, é tão simples quanto:
position.x += velocity.x * Δt;
position.y += velocity.y * Δt;
onde Δt
está seu delta de tempo - ou diferença de tempo - ou intervalo de tempo.
Atualizando posição e velocidade
Também é muito fácil lidar com a aceleração (como na gravidade). Se você tiver um vetor de aceleração, poderá atualizar a velocidade e a posição juntas assim:
position.x += (velocity.x * Δt) + (0.5 * acceleration.x * Δt * Δt);
position.y += (velocity.y * Δt) + (0.5 * acceleration.y * Δt * Δt);
velocity.x += acceleration.x * Δt;
velocity.y += acceleration.y * Δt;
(Esta é basicamente a fórmula s = vt + ½at² da Física 101.)
Aplicando uma velocidade
Se você deseja aplicar uma determinada velocidade em alguma direção normalizada, pode definir a velocidade da seguinte forma:
velocity.x = normalizedDirection.x * speed;
velocity.y = normalizedDirection.y * speed;
Derivando uma velocidade
E se você precisar fazer o inverso - derivando a velocidade e a direção de um determinado vetor de velocidade - você pode simplesmente usar o teorema de Pitágoras ou o .Length()
método:
speed = velocity.Length();
E uma vez que a velocidade é conhecida, a direção normalizada pode ser calculada dividindo a velocidade pela velocidade (tomando cuidado para evitar a divisão por zero):
if (speed != 0) {
normalizedDirection.x = velocity.x / speed;
normalizedDirection.y = velocity.y / speed;
} else {
normalizedDirection.x = 0;
normalizedDirection.y = 0;
}