public static double WheelTurnForEndZeroWheelTurnToPoint(this PCar car, Vector point, double finalAngle, double sign) { PCar physicCar = new PCar(car); int ticks = (int)Math.Abs(Math.Round(physicCar.WheelTurn / game.CarWheelTurnChangePerTick)); AngleReachEvent angleReach = new AngleReachEvent(finalAngle); MoveToAngleFunction mover = new MoveToAngleFunction(finalAngle); for (int i = 0; i < ticks; i++) { mover.Iteration(physicCar, 1); if (angleReach.Check(physicCar)) { break; } } Vector dir = physicCar.Speed.Length < 1 ? physicCar.Dir : physicCar.Dir * 0.8 + physicCar.Speed.Normalize() * 0.2; double distance = -(point - physicCar.Pos).Cross(dir); if (Math.Abs(distance) < 10) { return(0); } return(car.WheelTurn + sign * game.CarWheelTurnChangePerTick * Math.Sign(distance)); }
public void setupAngleReach(Vector angleDir) { angleReachEvent = new AngleReachEvent(angleDir.Angle); }