« Vivadoプロジェクト生成するTclの完成 | トップページ | Visual C#で点描画のやりかたを調べる »

2019.05.08

Visual StudioでC#のお勉強

Borland C++ 2006で進歩を止めてしまった私も、そろそろ現代風のアプリを開発できるようになりたいと思い、Visual StudioでC#の勉強を始めました。

Windows Formとか、WPFとか、UWPとかあるようなのですが、新しいものほど、のっぺりとした平べったいデザインになるようです。

作りたいのはCAD風の電子回路設計・デバッグ支援ツールなので、やはりWindows Formかな~と。MFCじゃないだけまだマシと思わなければ・・

とりあえず画面に波形を表示したり、四角や点などを描画できなければならないので、いろいろやってみました。

まずは波形を表示する方法を調べてみました。

 

C#で波形を表示するには、Chartというコンポーネントを使うようです。Chartの中にはSeriesというコレクションあって、このSeriesにPointsというのがあって、Series.Pointsに値を登録していけば波形が出ます。Chartは複数のSeriesを持つことができて、個々のSeriesごとに表示方法を変えられます。

Cs2

デフォルトでは棒グラフなのでGUIで設定を変えるか、

Series["<シリーズ名>"].ChartType = SeriesChartType.Line;

で表示方法を変えればよいようです。

作ったプログラムでは、Form1_Loadなどの初期化で以下のようにしました。動的にSeriesを作成して追加することもできそうです。

s1 = chart1.Series["Series1"];
s2 = chart1.Series["Series2"];
s3 = new Series("a");
chart1.Series.Add(s3);
s3.ChartType = SeriesChartType.Line;
s3.MarkerStyle = MarkerStyle.Cross;
s1.Color = Color.Red;
s2.Color = Color.Blue;
s3.Color = Color.Green;
random = new System.Random(123456);
s1.BorderWidth = 1;
s2.BorderWidth = 1;
s3.BorderWidth = 1;
chart1.ChartAreas[0].AxisX.Maximum = 1;
chart1.ChartAreas[0].AxisX.Minimum = 0;
chart1.ChartAreas[0].AxisY.Maximum = 1;
chart1.ChartAreas[0].AxisY.Minimum = 0;
chart1.ChartAreas[0].AxisX.Interval = 0.1;
chart1.ChartAreas[0].AxisX.Name = "時刻";
for (int i = 0; i < 100; i++)
{
double x = i / 100.0;
s1.Points.AddXY(x, x);
s2.Points.AddXY(x, x * x);
s3.Points.AddXY(x, x * x * 3);

そして、ボタンが押されたら乱数で波形を更新します。

var stopwatch = new System.Diagnostics.Stopwatch();
int maxIter = int.Parse(textBox1.Text);
cont = true;
stopwatch.Start();
for(int count=0;count < int.Parse(textBox1.Text);count++)
{
if (!cont) break;
s1.Points.Clear();
s2.Points.Clear();
s3.Points.Clear();
for (int i = 0; i < Define.VisibleDataPoint; i++)
{
double x = i / (double)Define.VisibleDataPoint;
s1.Points.AddXY(x, random.NextDouble());
s2.Points.AddXY(x, random.NextDouble());
s3.Points.AddXY(x, random.NextDouble());
}
chart1.Update();
Application.DoEvents();
}
stopwatch.Stop();
TimeSpan ts = stopwatch.Elapsed;
MessageBox.Show((stopwatch.ElapsedMilliseconds / int.Parse(textBox1.Text)) + "ミリ秒");

Cs1

線の太さを太くすると、やはり遅くなります。

速度に影響を与える要因としては、

  • 描画領域のサイズ
  • Seriesに入れた要素数
  • 線の太さ

が効いてきます。Seriesに10000ポイントとか入れるとめっちゃ遅くなります。どうせ表示しきれないので、L1キャッシュに入りきる量にしておくのが良いようです。

C#を触ってみた感想としては、C#では#defineで値を定義することができないことが面倒。

わざわざ

public static class Define
{
public const int VisibleDataPoint = 100;
}

のような値定義クラスを作って、Define.VisibleDataPointとしなければなりません。

乱数の生成もSystem.Random(最大値)でインスタンスを作ってNextで値を生成するようです。

なんでもクラス化してしまうわけですね。

そのわりに、スタティックな関数はクラス名::メソッドで呼び出せればいいのにクラス名.メソッドなので紛らわしい。

 

|

« Vivadoプロジェクト生成するTclの完成 | トップページ | Visual C#で点描画のやりかたを調べる »

コメント

コメントを書く



(ウェブ上には掲載しません)




« Vivadoプロジェクト生成するTclの完成 | トップページ | Visual C#で点描画のやりかたを調べる »