コード例 #1
0
        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);
        }
コード例 #2
0
 public RiseApplier(SettingsCommon settings, RisesModel riseModel, IGetRandom randomizer)
 {
     this.settings   = settings;
     this.randomizer = randomizer;
     this.riseModel  = riseModel;
     rises           = MakeRises(riseModel).ToArray();
 }