Example #1
0
        // グラフデータをgnuplot形式で書き出す
        string MakeGnuplotData()
        {
            var  output      = "";
            bool lineFeedFlg = false;

            // 現在のグラフデータ
            if (PrimaryCheckMenu.IsChecked)
            {
                output += $"#[{NowGraphName}]\n";
                var plotData = CalculationLogic.CalcPlotData(NowGraphParameter);
                foreach (var point in plotData)
                {
                    output += $"{point.X} {point.Y}\n";
                }
                lineFeedFlg = true;
            }
            // ストックしてあるグラフデータ
            if (graphParameterStock.Count >= 1)
            {
                foreach (var graphParameter in graphParameterStock)
                {
                    if (lineFeedFlg)
                    {
                        output += "\n\n";
                    }
                    output += $"#[{graphParameter.Name}]\n";
                    var plotData = CalculationLogic.CalcPlotData(graphParameter);
                    foreach (var point in plotData)
                    {
                        output += $"{point.X} {point.Y}\n";
                    }
                    lineFeedFlg = true;
                }
            }
            return(output);
        }
Example #2
0
        // グラフをプロットする
        public void Draw(bool reScaleFlg = true)
        {
            // 初期化前は何もしない
            if (ProbChart == null)
            {
                return;
            }
            // グラフエリアを初期化する
            ProbChart.Series.Clear();
            ProbChart.Legends.Clear();
            // グラフエリアの罫線色を設定する
            ProbChart.ChartAreas[0].AxisX.MajorGrid.LineColor = Color.LightGray;
            ProbChart.ChartAreas[0].AxisY.MajorGrid.LineColor = Color.LightGray;
            // グラフエリアにグラフを追加する
            var minAxisX = double.MaxValue;
            var maxAxisX = double.Epsilon;
            var maxAxisY = double.Epsilon;

            if (PrimaryCheckMenu.IsChecked)
            {
                var series = new Series();
                series.Name        = NowGraphName;
                series.ChartType   = SeriesChartType.Line;
                series.BorderWidth = 2;
                var plotData = CalculationLogic.CalcPlotData(NowGraphParameter);
                for (int i = 0; i < plotData.Count - (AfterLineCheckMenu.IsChecked ? 0 : 1); ++i)
                {
                    series.Points.AddXY(plotData[i].X, plotData[i].Y * 100);
                    if (plotData[i].X > 950.0)
                    {
                        continue;
                    }
                    minAxisX = Math.Min(minAxisX, plotData[i].X);
                    maxAxisX = Math.Max(maxAxisX, plotData[i].X);
                    maxAxisY = Math.Max(maxAxisY, plotData[i].Y * 100);
                }
                ProbChart.Series.Add(series);
                var legend = new Legend();
                legend.DockedToChartArea = "ChartArea";
                legend.Alignment         = StringAlignment.Far;
                ProbChart.Legends.Add(legend);
            }
            var bindData = DataContext as MainWindowViewModel;

            // グラフエリアにストックしたグラフを追加する
            foreach (var graphParameter in graphParameterStock)
            {
                var series = new Series();
                series.Name        = graphParameter.Name;
                series.ChartType   = SeriesChartType.Line;
                series.BorderWidth = 2;
                var plotData = CalculationLogic.CalcPlotData(graphParameter);
                for (int i = 0; i < plotData.Count - (AfterLineCheckMenu.IsChecked ? 0 : 1); ++i)
                {
                    series.Points.AddXY(plotData[i].X, plotData[i].Y * 100);
                    if (plotData[i].X > 950.0)
                    {
                        continue;
                    }
                    minAxisX = Math.Min(minAxisX, plotData[i].X);
                    maxAxisX = Math.Max(maxAxisX, plotData[i].X);
                    maxAxisY = Math.Max(maxAxisY, plotData[i].Y * 100);
                }
                ProbChart.Series.Add(series);
                var legend = new Legend();
                legend.DockedToChartArea = "ChartArea";
                legend.Alignment         = StringAlignment.Far;
                ProbChart.Legends.Add(legend);
            }
            // スライドバーに合った位置の縦棒を追加する
            if (ChartCursorSlider != null && (PrimaryCheckMenu.IsChecked || graphParameterStock.Count >= 1))
            {
                var series = new Series();
                series.Name        = "Cursor";
                series.ChartType   = SeriesChartType.Line;
                series.BorderWidth = 2;
                int cursorValue = (int)ChartCursorSlider.Value;
                series.Points.AddXY(cursorValue, 0);
                series.Points.AddXY(cursorValue, 100);
                ProbChart.Series.Add(series);
                // 縦棒の位置における各グラフの数値を読み取り、表示に加える
                string titleText = $"HeavyDamageCalculator(最終攻撃力{cursorValue}";
                if (PrimaryCheckMenu.IsChecked)
                {
                    var plotData = CalculationLogic.CalcPlotData(NowGraphParameter);
                    titleText += $",{Math.Round(CalculationLogic.CalcGraphValueLinear(plotData, cursorValue) * 100, 1)}%";
                }
                foreach (var graphParameter in graphParameterStock)
                {
                    var plotData = CalculationLogic.CalcPlotData(graphParameter);
                    titleText += $",{Math.Round(CalculationLogic.CalcGraphValueLinear(plotData, cursorValue) * 100, 1)}%";
                }
                titleText += ")";
                this.Title = titleText;
            }
            // スケールを調整する
            {
                var axisX = ProbChart.ChartAreas[0].AxisX;
                axisX.Title = "最終攻撃力";
                var minimum   = minAxisX;
                var maximum   = maxAxisX;
                var center    = (maximum + minimum) / 2;
                var halfRange = maximum - center;
                if (reScaleFlg)
                {
                    axisX.Minimum  = Math.Max(SpecialFloor(center - halfRange / ChartScaleSlider.Value, chartScaleIntervalX[chartScaleIntervalIndexX]), 0.0);
                    axisX.Maximum  = SpecialCeiling(center + halfRange / ChartScaleSlider.Value, chartScaleIntervalX[chartScaleIntervalIndexX]);
                    axisX.Interval = chartScaleIntervalX[chartScaleIntervalIndexX];
                }
                if (ChartCursorSlider != null)
                {
                    ChartCursorSlider.Minimum = (int)axisX.Minimum;
                    ChartCursorSlider.Maximum = (int)axisX.Maximum;
                }
            }
            {
                var axisY = ProbChart.ChartAreas[0].AxisY;
                axisY.Title   = "大破率(%)";
                axisY.Minimum = 0;
                var temp = SpecialCeiling(maxAxisY, chartScaleIntervalY[chartScaleIntervalIndexY]);
                axisY.Maximum  = MaxMin(temp, 0.0, 100.0);
                axisY.Interval = chartScaleIntervalY[chartScaleIntervalIndexY];
            }
        }