【C#】Chartグラフ-時計-(1)
役に立つのか? Chartで 謎グラフを作ってしまう……( ^ω^)
円グラフは、レーダーとか割合を示すグラフはありますが、
時計のようなアイテムは今のところ見当たらなかったので、自分で作ってしまいました。
(とりあえず秒針のみなので、分とかはない。)
todo
秒針のみの時計
手順
1. 目盛り線を消去
2. 円の枠を作成
3. 針を作成(2点取る線グラフ)
4. timerで360°針を動かす(秒針)
↑力尽きたので2回に分けてます。
1. 目盛り線を消去
軸を消して、円だけ描画したい
private string Name1 = "Bar1"; private string AreaName1 = "chartArea1"; private string Watch1 = "seconds"; private void init_chart(Chart chart, int range) { // 初期化 chart.Series.Clear(); chart.ChartAreas.Clear(); chart.Legends.Clear();// 凡例非表示 // chart設定 chart.ChartAreas.Add(AreaName1); // add x軸目盛数値を非表示 chart.ChartAreas[AreaName1].AxisX.LabelStyle.Enabled = false; chart.ChartAreas[AreaName1].AxisY.LabelStyle.Enabled = false; // 目盛線ちょっと出てるところがなくなる chart.ChartAreas[AreaName1].AxisX.MajorTickMark.Enabled = false; chart.ChartAreas[AreaName1].AxisY.MajorTickMark.Enabled = false; // 目盛線なくす chart.ChartAreas[AreaName1].AxisX.MajorGrid.Enabled = false; chart.ChartAreas[AreaName1].AxisY.MajorGrid.Enabled = false; // 最大最小設定 chart.ChartAreas[AreaName1].AxisY.Maximum = range; chart.ChartAreas[AreaName1].AxisY.Minimum = -range; chart.ChartAreas[AreaName1].AxisX.Maximum = range; chart.ChartAreas[AreaName1].AxisX.Minimum = -range; // 軸が交差する点 chart.ChartAreas[AreaName1].AxisX.Crossing = 0; chart.ChartAreas[AreaName1].AxisY.Crossing = 0; chart.ChartAreas[AreaName1].AxisX.LineColor = Color.Transparent;//軸 chart.ChartAreas[AreaName1].AxisY.LineColor = Color.Transparent;//軸 // 円描画 circle(chart, Name1, range); // 時計の針設定 init_watch1(chart, Watch1); }
chart.ChartAreas[AreaName1].AxisX.Crossin
で、x=0のときy軸と交差するように設定しています。
軸そのものを非表示したかったのですが、
出来たはずだけど忘れてしまったので、とりあえず色をTransparentに。
無理やりな感じですが、まあ普通はこんなやり方しないんだろうな……( ^ω^)
会社でぼっち作業でやっているので、まあ「普通」というのがわからない…………??????
2. 円の枠を作成
グラフの種類を折れ線グラフのLineにします。
circle()関数を作成、設定と描画をここで行います。
private void circle(Chart chart, string name, int radius) { // 円line描画 radius:半径 chart.Series.Add(name);// Series追加 chart.Series[name].ChartType = SeriesChartType.Line;// chart種類:折れ線 chart.Series[name].Color = Color.Pink; chart.Series[name].Points.Clear(); double x = 0; double y = 0; for (int i = 0; i <= 360; i++) { x = Math.Sin((i * Math.PI) / 180) * (double)radius; y = Math.Cos((i * Math.PI) / 180) * (double)radius; chart.Series[name].Points.Add(new DataPoint(x, y)); } }
参考
ChartAxis Class (Microsoft.ReportingServices.OnDemandReportRendering) | Microsoft Docs