Where to aim: the target's position at interceptTime, i.e.
targetPosition + targetVelocity · interceptTime(...).
Returns null — and leaves outunmodified — when there is no
interception, so a caller cannot mistake a stale or NaN-filled vector for an
aim point. Firing a projectile of exactly projectileSpeed from
shooterPosition straight at the returned point hits the target; the tests
assert that against an independently simulated projectile.
Where to aim: the target's position at interceptTime, i.e.
targetPosition + targetVelocity · interceptTime(...).Returns
null— and leavesoutunmodified — when there is no interception, so a caller cannot mistake a stale orNaN-filled vector for an aim point. Firing a projectile of exactlyprojectileSpeedfromshooterPositionstraight at the returned point hits the target; the tests assert that against an independently simulated projectile.