winformsでプロットした経験はありませんが、私はecgをプロットする必要があります。または特定の領域でsin波や波動関数を言うことができますが、私がやっていることはecgです。フォームの残りの部分は、ボタンやラベルのある通常のフォームになりますWinformsでECGをプロットする
誰でもチュートリアル
:)
winformsでプロットした経験はありませんが、私はecgをプロットする必要があります。または特定の領域でsin波や波動関数を言うことができますが、私がやっていることはecgです。フォームの残りの部分は、ボタンやラベルのある通常のフォームになりますWinformsでECGをプロットする
誰でもチュートリアル
:)
あなたはいくつかの選択肢を持っている、あなたは、データを処理し、それをレンダリングすること、独自のコントロールを作成することができます。より複雑なプロットの場合、少し複雑になることがありますが、基本は常に同じで、XとYの値の範囲を設定し、GDIを使って左から右へ線を描画します。
これは、より高度な機能のために少し複雑になる可能性があるので、私はthisの投稿を読むか、codeproject.comをチェックして、いくつかのチャーティングコントロールを使用することができました。オープンソースでは、新しい記事はおそらくWPFでコード化されますが、古いものも見つかるはずです。
編集:
あなたが便利見つけることができますいくつかのリンク:Graph plotting lib that's main goal is to simulate ECGかanother graph plotting lib
あなたはカスタムコントロールを作成する必要があります。
public class MyECGDrawer : Control{}
それは、あなたが次にペイント機能で、あなたのグラフィックあなたがそれを望むように描くのOnPaintイベント
protect override OnPaint(PaintEventArgs pe){}
を上書きする、のは罪(x)は
// refresh background
pe.Graphics.FillRectangle(Brushes.White, 0, 0, Width, Height);
int prevX = -1, prevY = -1;
for(int x = 0; x < Width; x++)
{
if(prevX >= 0)
{
pe.Graphics.DrawLine(Pens.Black, prevX, prevY, x, Math.sin(x));
}
prevX = x;
prevY = Math.sin(x);
}
をしましょう
ECGを強制的に再描画するには、コントロールの.Invalidate()関数を呼び出します。フォーム内のコントロールをデザイナーからドラッグアンドドロップできるはずです。
最後に、クラスが
パブリッククラスMyECGDrawerのようになります。あなたはこれをやっている場合を除きコントロール{}これで
を、あなたはOnPaintイベント
public class MyECGDrawer : Control
{
protect override OnPaint(PaintEventArgs pe)
{
// refresh background
pe.Graphics.FillRectangle(Brushes.White, 0, 0, Width, Height);
int prevX = -1, prevY = -1;
for(int x = 0; x < Width; x++)
{
if(prevX >= 0)
pe.Graphics.DrawLine(Pens.Black, prevX, prevY, x, Math.sin(x));
prevX = x;
prevY = Math.sin(x);
}
}
}
おかげでたくさん:) – Moon
を上書き無料のMicrosoft Chart Controls for .NETをご覧になることをお勧めします。あなたがあなた自身をロールバックしたい場合は言われて、私は次のガイドラインを提供することを
。
GDI +に関するいくつかの良い本があります。あなたが深く入っているなら、1つを選ぶことをお勧めします。
おかげでたくさん:) – Moon
私は以下を書いてテストしました。それは、あなたが望むことをしているようですが、遅延なしでsin(x)をプロットするだけです。つまり、sin(x)のプロットは左端から非常に速く見えないからです。ただし、ループ内の任意の行にブレークを入れ、F5キーを押しながらループを進めてゆっくりと動作させることができます。ストリーミングECGデータは一定のスピードでしか到達しないため、実装上問題はありません。
以下では、monitorはwinformsフォームのPictureBoxです。それ以外はすべてローカルです。
private void drawStream(){
const int scaleX = 40;
const int scaleY = 40;
Point monitorTopLeft = new Point(0, 0);
Point MonitorTopLeftMinus1 = new Point(-1, 0);
int halfX = monitor.Width/2;
int halfY = monitor.Height/2;
Size size = new Size(halfX + 20, monitor.Height);
Graphics g = monitor.CreateGraphics();
g.TranslateTransform(halfX, halfY);
g.ScaleTransform(scaleX, scaleY);
g.Clear(Color.Black);
g.ResetClip();
float lastY = (float)Math.Sin(0);
float y = lastY;
Pen p = new Pen(Color.White, 0.01F);
float stepX = 1F/scaleX;
for (float x = 0; x < 10; x += stepX) {
g.CopyFromScreen(monitor.PointToScreen(monitorTopLeft), MonitorTopLeftMinus1, size, CopyPixelOperation.SourceCopy);
y = (float)Math.Sin(x);
g.DrawLine(p, -stepX, lastY, 0, y);
lastY = y;
}
}
役立つかもしれないいくつかの追加情報:
@クリス裁判官:US ECGの最も25ミリメートル/秒であり、海外のあなたが得ることができる50ミリメートル/秒(または心臓ICUやテレメトリで米国のフロア)。だから、もしあなたが約10ms(おそらく40-50ms)の睡眠を入れたら、96dpiを仮定しておおよその速度になります。 – user7116
おかげでたくさん:) – Moon