Джейсон,
Вместо того, чтобы иметь три атрибута объекта,
- Точка (х, у) позиция
- Направление Vector2D (x, y)
- Int скорость
часто намного проще объединить направление и скорость в вектор скорости. Тогда у вас есть только два атрибута,
- Точка (х, у) позиция
- Vector2D (x, y) скорость
Обновление позиции
Когда вам нужно обновить позицию объекта, это так просто:
position.x += velocity.x * Δt;
position.y += velocity.y * Δt;
где Δt
ваша дельта времени - или разница во времени - или шаг по времени.
Обновление позиции и скорости
Это также очень легко справиться с ускорением (например, от силы тяжести). Если у вас есть вектор ускорения, вы можете обновить скорость и положение вместе следующим образом:
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;
(Это в основном формула s = vt + ½at² из физики 101.)
Применяя скорость
Если вы хотите применить заданную скорость в некотором нормализованном направлении, вы можете установить скорость следующим образом:
velocity.x = normalizedDirection.x * speed;
velocity.y = normalizedDirection.y * speed;
Получение скорости
И если вам нужно сделать обратное - вывести скорость и направление из заданного вектора скорости - вы можете просто использовать теорему Пифагора или .Length()
метод:
speed = velocity.Length();
И как только скорость известна, нормализованное направление может быть вычислено путем деления скорости на скорость (будьте осторожны, чтобы не делить на ноль):
if (speed != 0) {
normalizedDirection.x = velocity.x / speed;
normalizedDirection.y = velocity.y / speed;
} else {
normalizedDirection.x = 0;
normalizedDirection.y = 0;
}