memo

プログラミング備忘録

【C#】Chartグラフ-時計-(1)

役に立つのか? Chartで 謎グラフを作ってしまう……( ^ω^)

円グラフは、レーダーとか割合を示すグラフはありますが、
時計のようなアイテムは今のところ見当たらなかったので、自分で作ってしまいました。
(とりあえず秒針のみなので、分とかはない。)

todo
 秒針のみの時計

手順
1. 目盛り線を消去
2. 円の枠を作成
3. 針を作成(2点取る線グラフ)
4. timerで360°針を動かす(秒針)

↑力尽きたので2回に分けてます。

1. 目盛り線を消去

軸を消して、円だけ描画したい
f:id:shinopikapi:20190202233948p:plain

        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