/// <summary> /// チャート描画のパフォーマンスを改善するため、データの間引きを行います。 /// </summary> /// <param name="log">資材の時系列データ</param> /// <param name="period">描画対象期間</param> /// <returns></returns> public static IEnumerable <TimeMaterialsPair> ThinOut(this IEnumerable <TimeMaterialsPair> log, DisplayedPeriod period) { if (log.Count() == 0) { yield break; } TimeSpan minimumTimeStep = GetMinimumTimeStep(period); double minimumMaterialRatio = GetMinimumMaterialRatio(period); // 最初のデータは必ず返す yield return(log.First()); TimeMaterialsPair lastData = log.First(); foreach (var data in log.Skip(1)) { // 前のデータから時刻あるいは資材量が十分離れているデータであれば値を返す if (HasSeriouslyChanged(lastData, data, minimumTimeStep, minimumMaterialRatio)) { yield return(data); lastData = data; } } // 直近のデータは必ず返す if (!lastData.Equals(log.Last())) { yield return(log.Last()); } }
/// <summary> /// グラフに新しいデータを追加します。 /// </summary> /// <param name="newData"></param> public void UpdateData(TimeMaterialsPair newData) { SetXAxis(newData); SetMaterialYAxis(Math.Max(this.mostMaterial, newData.MostMaterial)); SetRepairToolYAxis(Math.Max(this.mostRepairTool, newData.RepairTool)); AddChartData(newData); }
private static bool HasSeriouslyChanged(TimeMaterialsPair oldData, TimeMaterialsPair newData, TimeSpan minimumTimeStep, double minimumMaterialRatio) { // 5%くらい変化したら大きく変わったとみてよい return(newData.DateTime - oldData.DateTime >= minimumTimeStep || Math.Abs(newData.Fuel - oldData.Fuel) >= oldData.Fuel * minimumMaterialRatio || Math.Abs(newData.Ammunition - oldData.Ammunition) >= oldData.Fuel * minimumMaterialRatio || Math.Abs(newData.Steel - oldData.Steel) >= oldData.Steel * minimumMaterialRatio || Math.Abs(newData.Bauxite - oldData.Bauxite) >= oldData.Bauxite * minimumMaterialRatio || Math.Abs(newData.RepairTool - oldData.RepairTool) >= oldData.RepairTool * minimumMaterialRatio); }
private void AddChartData(TimeMaterialsPair data) { Application.Current.Dispatcher.Invoke( () => { FuelSeries.Add(new ChartPoint(data.DateTime, data.Fuel)); AmmunitionSeries.Add(new ChartPoint(data.DateTime, data.Ammunition)); SteelSeries.Add(new ChartPoint(data.DateTime, data.Steel)); BauxiteSeries.Add(new ChartPoint(data.DateTime, data.Bauxite)); RepairToolSeries.Add(new ChartPoint(data.DateTime, data.RepairTool)); }); var currentDateTime = data.DateTime; var storableLimit = new ObservableCollection <ChartPoint>(); storableLimit.Add(new ChartPoint(currentDateTime - ChartSettings.DisplayedPeriod.Value.ToTimeSpan(), materialManager.StorableMaterialLimit)); storableLimit.Add(new ChartPoint(currentDateTime, materialManager.StorableMaterialLimit)); this.StorableLimitSeries = storableLimit; }
/// <summary> /// X軸の設定を行います。 /// </summary> private void SetXAxis(TimeMaterialsPair newData) { // X軸 XMin = newData.DateTime - ChartSettings.DisplayedPeriod.Value.ToTimeSpan(); XMax = newData.DateTime; }
private static bool HasSeriouslyChanged(TimeMaterialsPair oldData, TimeMaterialsPair newData, TimeSpan minimumTimeStep, double minimumMaterialRatio) { // 5%くらい変化したら大きく変わったとみてよい return newData.DateTime - oldData.DateTime >= minimumTimeStep || Math.Abs(newData.Fuel - oldData.Fuel) >= oldData.Fuel * minimumMaterialRatio || Math.Abs(newData.Ammunition - oldData.Ammunition) >= oldData.Fuel * minimumMaterialRatio || Math.Abs(newData.Steel - oldData.Steel) >= oldData.Steel * minimumMaterialRatio || Math.Abs(newData.Bauxite - oldData.Bauxite) >= oldData.Bauxite * minimumMaterialRatio || Math.Abs(newData.RepairTool - oldData.RepairTool) >= oldData.RepairTool * minimumMaterialRatio; }
/// <summary> /// チャートにバインディングされたObservableCollectionのデータをリフレッシュします。 /// </summary> /// <param name="neededData"></param> private void RefleshChartData(TimeMaterialsPair[] neededData) { var fuels = new ObservableCollection<ChartPoint>(); var ammunitions = new ObservableCollection<ChartPoint>(); var steels = new ObservableCollection<ChartPoint>(); var bauxites = new ObservableCollection<ChartPoint>(); var repairTools = new ObservableCollection<ChartPoint>(); var storableLimit = new ObservableCollection<ChartPoint>(); foreach (var data in neededData) { fuels.Add(new ChartPoint(data.DateTime, data.Fuel)); ammunitions.Add(new ChartPoint(data.DateTime, data.Ammunition)); steels.Add(new ChartPoint(data.DateTime, data.Steel)); bauxites.Add(new ChartPoint(data.DateTime, data.Bauxite)); repairTools.Add(new ChartPoint(data.DateTime, data.RepairTool)); } var currentDateTime = neededData[neededData.Length - 1].DateTime; storableLimit.Add(new ChartPoint(currentDateTime - ChartSettings.DisplayedPeriod.Value.ToTimeSpan(), materialManager.StorableMaterialLimit)); storableLimit.Add(new ChartPoint(currentDateTime, materialManager.StorableMaterialLimit)); this.FuelSeries = fuels; this.AmmunitionSeries = ammunitions; this.SteelSeries = steels; this.BauxiteSeries = bauxites; this.RepairToolSeries = repairTools; this.StorableLimitSeries = storableLimit; }
private void AddChartData(TimeMaterialsPair data) { Application.Current.Dispatcher.Invoke( () => { FuelSeries.Add(new ChartPoint(data.DateTime, data.Fuel)); AmmunitionSeries.Add(new ChartPoint(data.DateTime, data.Ammunition)); SteelSeries.Add(new ChartPoint(data.DateTime, data.Steel)); BauxiteSeries.Add(new ChartPoint(data.DateTime, data.Bauxite)); RepairToolSeries.Add(new ChartPoint(data.DateTime, data.RepairTool)); }); var currentDateTime = data.DateTime; var storableLimit = new ObservableCollection<ChartPoint>(); storableLimit.Add(new ChartPoint(currentDateTime - ChartSettings.DisplayedPeriod.Value.ToTimeSpan(), materialManager.StorableMaterialLimit)); storableLimit.Add(new ChartPoint(currentDateTime, materialManager.StorableMaterialLimit)); this.StorableLimitSeries = storableLimit; }