private static double getTangentalVelocity( StaticPosition firingPosition, Snapshot target ) { double bearingToTarget = firingPosition.getBearing( target ); // [0,2pi) StaticPosition projectedTarget = new Projection( target ).project().getStaticPosition(); // the control position is 8.0 units to the right (tangentally) of the present target position StaticPosition controlPosition = new StaticPositionImpl( target, bearingToTarget + Constraints.rightAngle, Constraints.maxAbsVehicleVelocity ); double bearingToProjectedTarget = Constraints.getNegativePiToPi( firingPosition.getBearing( projectedTarget ) - bearingToTarget ); double bearingToControlPosition = Constraints.getNegativePiToPi( firingPosition.getBearing( controlPosition ) - bearingToTarget ); double tangentalVelocity = bearingToProjectedTarget / bearingToControlPosition; return tangentalVelocity; }