/// <summary> /// Compute the longitudinal acceleration of a car in a lane, based on the IDM /// </summary> /// <param name="car">Car to compute acceleration of</param> /// <param name="carInFront">Car in front of the current car, may be null if current car is the leader</param> /// <param name="lane">Lane the two cars are in</param> /// <returns></returns> private static float AccelerationOfCarInLane(Vehicle car, Vehicle carInFront, Lane lane) { if (car == null) { return(0); } LeaderVehicleInfo leaderCarInfo = lane.ComputeLeaderCarInfo(car, carInFront); Vector2 trafficDirection = lane.Path.TangentOfProjectedPosition(car.Position); Vector2 acc = IntelligentDriverModel.ComputeAccelerationIntensity( car, trafficDirection, leaderCarInfo.DistToNextCar, leaderCarInfo.ApproachingRate ); // Acceleration in direction of traffic (can be negaitve, -> vehicle will have to brake) return(Vector2.Dot(acc, trafficDirection)); }