Skip to content

Instantly share code, notes, and snippets.

@MerlinTwi
Created May 15, 2019 18:01
Show Gist options
  • Save MerlinTwi/e44f97d717a33d5b768d431131e8befa to your computer and use it in GitHub Desktop.
Save MerlinTwi/e44f97d717a33d5b768d431131e8befa to your computer and use it in GitHub Desktop.
/// <summary>
/// Через сколько времени удастся перехватить равномерно двигающуюся цель,
/// если мы будем двигаться в место встречи со скоростью mySpeed
/// </summary>
/// <param name="targetPosition">текущее положение цели</param>
/// <param name="targetSpeed">вектор движения цели</param>
/// <param name="myPosition">наше текущее положение</param>
/// <param name="mySpeed">наша скорость движения</param>
/// <returns>через сколько времени встретимся.
/// Место встречи: targetPosition + targetSpeed*t</returns>
public static float InterceptTime(Vector2 targetPosition, Vector2 targetSpeed,
Vector2 myPosition, float mySpeed) {
var delta = targetPosition - myPosition;
var deltaSq = delta.sqrMagnitude;
var targetSpeedSq = targetSpeed.sqrMagnitude;
if (targetSpeedSq < 0.00001f) // цель практически не двигается
return Mathf.Sqrt(deltaSq)/mySpeed;
var dpv = Vector2.Dot(delta, targetSpeed);
var a = dpv * dpv - deltaSq * targetSpeedSq + deltaSq * mySpeed * mySpeed;
return (dpv + Mathf.Sqrt(a)) / (mySpeed * mySpeed - targetSpeedSq);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment