コード例 #1
0
        /// <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());
            }
        }
コード例 #2
0
 /// <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);
 }
コード例 #3
0
 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);
 }
コード例 #4
0
        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;
        }
コード例 #5
0
 /// <summary>
 /// X軸の設定を行います。
 /// </summary>
 private void SetXAxis(TimeMaterialsPair newData)
 {
     // X軸
     XMin = newData.DateTime - ChartSettings.DisplayedPeriod.Value.ToTimeSpan();
     XMax = newData.DateTime;
 }
コード例 #6
0
 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;
 }
コード例 #7
0
 /// <summary>
 /// X軸の設定を行います。
 /// </summary>
 private void SetXAxis(TimeMaterialsPair newData)
 {
     // X軸
     XMin = newData.DateTime - ChartSettings.DisplayedPeriod.Value.ToTimeSpan();
     XMax = newData.DateTime;
 }
コード例 #8
0
        /// <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;
        }
コード例 #9
0
        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;
        }
コード例 #10
0
 /// <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);
 }