private Rise[] MakeRises(RisesModel riserModel) { if (riserModel == null) { return new Rise[] { } } ; var riseIndexes = Enumerable.Range(0, riserModel.Count); var totalAllowedTime = settings.TrackLength - riserModel.EarliestTime; var rises = riseIndexes.Select(s => { var earliestStartTime = riserModel.EarliestTime + totalAllowedTime * s / riserModel.Count; var latestEndTime = riserModel.EarliestTime + totalAllowedTime * (double)(s + 1) / riserModel.Count; //the total time window the rise can occur in. var latestStartTime = latestEndTime - riserModel .LengthEach; // but we don't want rises to overlap (calculation too complicated if nothing else), so limit the latest start time if (latestStartTime < earliestStartTime) { latestStartTime = earliestStartTime; } var startTime = earliestStartTime + randomizer.GetRandom(0.5) * (latestStartTime - earliestStartTime); var endTime = startTime + riseModel.LengthEach; var minAttenuation = Math.Pow(1 - riserModel.Amount, riserModel.Count - s); var maxAttenuation = Math.Pow(1 - riserModel.Amount, riserModel.Count - s - 1); return(new Rise(startTime, endTime, 1 - riserModel.Amount, 1)); }).ToArray(); return(rises); }
public RiseApplier(SettingsCommon settings, RisesModel riseModel, IGetRandom randomizer) { this.settings = settings; this.randomizer = randomizer; this.riseModel = riseModel; rises = MakeRises(riseModel).ToArray(); }