// グラフデータを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); }
// グラフをプロットする 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]; } }