private static void UpdateTrainPassengers(Train Train, double TimeElapsed)
{
double accelerationDifference = Train.Specs.CurrentAverageAcceleration - Train.Passengers.CurrentAcceleration;
double jerk = 0.25 + 0.10 * Math.Abs(accelerationDifference);
double accelerationQuanta = jerk * TimeElapsed;
if (Math.Abs(accelerationDifference) < accelerationQuanta)
{
Train.Passengers.CurrentAcceleration = Train.Specs.CurrentAverageAcceleration;
accelerationDifference = 0.0;
}
else
{
Train.Passengers.CurrentAcceleration += (double)Math.Sign(accelerationDifference) * accelerationQuanta;
accelerationDifference = Train.Specs.CurrentAverageAcceleration - Train.Passengers.CurrentAcceleration;
}
Train.Passengers.CurrentSpeedDifference += accelerationDifference * TimeElapsed;
double acceleration = 0.10 + 0.35 * Math.Abs(Train.Passengers.CurrentSpeedDifference);
double speedQuanta = acceleration * TimeElapsed;
if (Math.Abs(Train.Passengers.CurrentSpeedDifference) < speedQuanta)
{
Train.Passengers.CurrentSpeedDifference = 0.0;
}
else
{
Train.Passengers.CurrentSpeedDifference -= (double)Math.Sign(Train.Passengers.CurrentSpeedDifference) * speedQuanta;
}
if (Train.Passengers.PassengerRatio > 0.0)
{
double threshold = 1.0 / Train.Passengers.PassengerRatio;
if (Math.Abs(Train.Passengers.CurrentSpeedDifference) > threshold)
{
Train.Passengers.FallenOver = true;
}
else
{
Train.Passengers.FallenOver = false;
}
}
else
{
Train.Passengers.FallenOver = false;
}
}