private double CalculateSpeed(double intervalPos) { var value = ScaleCurveToValue(SpeedCurve.GetValue(intervalPos), 100, 1); if (value < 1) value = 1; return value; }
private int CalculateSpeed(double intervalPos) { var value = (int)Math.Round(ScaleCurveToValue(SpeedCurve.GetValue(intervalPos), 100, 1)); if (value < 1) value = 1; return value; }
private int CalculateSpeed(double intervalPos) { var value = (int)Math.Round(ScaleCurveToValue(SpeedCurve.GetValue(intervalPos), 100, 1) * FrameTime / 50d); if (value < 1) { value = 1; } return(value); }
private double CalculateSpeed(double intervalPos) { var value = ScaleCurveToValue(SpeedCurve.GetValue(intervalPos), 50, 1); if (value < 1) { value = 1; } return(value); }
private double CalculateSpeed(double intervalPos) { var value = ScaleCurveToValue(SpeedCurve.GetValue(intervalPos), 100, 1) * FrameTime / 50d; if (value < 1) { value = 1; } return(value); }
private async Task DecelerateLocomotiveCurve( Locomotive ecosLoc, SpeedCurve speedCurve, int maxSeconds = -1, Func <bool> hasToBeCanceled = null ) { if (maxSeconds <= -1) { maxSeconds = speedCurve.MaxTime; } var currentSpeed = (float)ecosLoc.Speedstep; var maxSpeed = speedCurve.MaxSpeed; var noOfSpeedsteps = ecosLoc.GetNumberOfSpeedsteps(); var minSpeed = GetMinSpeed(noOfSpeedsteps); var timeSteps = (speedCurve.MaxTime / (float)maxSpeed) * 1000.0; await Task.Run(() => { // // IMPORTANT NOTE: // do not slow down the locomotive completly // we still have to reach the fbIn, when reached // the train will stop right at this moment // var sw = Stopwatch.StartNew(); var idx = -1; for (var i = 0; i < speedCurve.Steps.Count - 1; ++i) { var s0 = speedCurve.Steps[i]; var s1 = speedCurve.Steps[i + 1]; if (currentSpeed >= s0.Speed && currentSpeed < s1.Speed) { idx = i; break; } } if (idx == -1) { idx = speedCurve.Steps.Count - 1; } for (var i = idx; i > minSpeed; --i) { var nextSpeed = speedCurve.Steps[i]; // // walltime reached // if (sw.ElapsedMilliseconds / 1000 > maxSeconds) { return; } Ctx.GetClientHandler()?.LocomotiveChangeSpeedstep(ecosLoc, (int)nextSpeed.Speed); __showSpeed((int)nextSpeed.Speed); if (IsCanceled()) { Ctx.GetClientHandler()?.LocomotiveChangeSpeedstep(ecosLoc, 0); return; } if (hasToBeCanceled != null) { if (hasToBeCanceled()) { return; } } if (__delayDecelerate((int)timeSteps, sw, maxSeconds, hasToBeCanceled)) { return; } if (hasToBeCanceled != null) { if (hasToBeCanceled()) { return; } } } }, CancelSource.Token); }
private double CalculateSpeed(double intervalPos) { return(ScaleCurveToValue(SpeedCurve.GetValue(intervalPos), 15, -15)); }
private double CalculateSpeed(double intervalPos) { return(ScaleCurveToValue(SpeedCurve.GetValue(intervalPos), 80, -80) * FrameTime / 50d); }
private async Task AccelerateLocomotiveCurve( int currentSpeed, Locomotive ecosLoc, SpeedCurve speedCurve, int maxSeconds = -1, Func <bool> hasToBeCanceled = null) { if (ecosLoc == null) { return; } if (speedCurve == null) { return; } currentSpeed = KickStart(currentSpeed, ecosLoc); if (maxSeconds <= -1) { maxSeconds = speedCurve.MaxTime; } var targetSpeed = speedCurve.MaxSpeed; var timeSteps = speedCurve.MaxTime / (float)speedCurve.MaxSpeed * 1000.0; await Task.Run(() => { var hasCanceled = false; var sw = Stopwatch.StartNew(); var idxOfCurrentSpeed = 0; for (var i = 0; i < speedCurve.Steps.Count - 1; ++i) { var itSpeed = speedCurve.Steps[i]; var itSpeed2 = speedCurve.Steps[i + 1]; if (currentSpeed >= itSpeed.Speed && currentSpeed < itSpeed2.Speed) { idxOfCurrentSpeed = i; break; } } for (var i = idxOfCurrentSpeed; i <= speedCurve.Steps.Count; ++i) { var newSpeed = speedCurve.Steps[i].Speed; Ctx.GetClientHandler()?.LocomotiveChangeSpeedstep(ecosLoc, (int)newSpeed); __showSpeed((int)newSpeed); if (newSpeed >= targetSpeed) { break; } // // walltime reached // if (sw.ElapsedMilliseconds / 1000 > maxSeconds) { return; } if (IsCanceled()) { hasCanceled = true; break; } if (hasToBeCanceled != null) { if (hasToBeCanceled()) { break; } } if (__delayAccelerate((int)timeSteps, sw, maxSeconds, hasToBeCanceled)) { return; } if (hasToBeCanceled != null) { if (hasToBeCanceled()) { break; } } } if (hasCanceled) { // TBD } }, CancelSource.Token); }