2016-08-18 5 views
0

C#を使用してカーソルの位置を記録しているうちに、カーソルを自分のモニターの円形の軌跡に移動します。ここで私は、カーソルとも経過時間を記録するために使用するコードは次のとおりです。C#で記録されたカーソルの騒音

Stopwatch swTime = new Stopwatch(); 
    private StreamWriter swRecorder; 

    private void start_Click(object sender, EventArgs e) 
    { 
     swRecorder = new StreamWriter("cursor.txt"); 
     swTime.Start(); 
     timer1.Enabled = true; 
    } 

    private void stop_Click(object sender, EventArgs e) 
    { 

     timer1.Enabled = false; 
     swTime.Stop(); 
     swRecorder.Close(); 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     string strNewLine = swTime.Elapsed.TotalMilliseconds.ToString(); 
     strNewLine = strNewLine + "," + Cursor.Position.X.ToString(); 
     swRecorder.WriteLine(strNewLine); 
    } 

私は時間に対するカーソルのレコーダ位置(X成分)をプロットした場合、私は次のプロットを取得します:

enter image description here

次に、速度(DeltaX/DeltaT)を測定し、再び時間に対してプロットします。それから私は、次のプロットを取得します:

enter image description here

今私の質問は:速度がギザギザ/うるさいですなぜですか?

+1

カーソルを安定した速度で動かさないためですか? – PaulF

+0

タイマー自体のティックの長さのためかもしれませんか?編集:下記の@dlxeon非常に正確な答えを見てください。 –

+0

@RyanPetersプロットは、録音の時間に対して描画されます。だから、ティックの長さは問題になることはできません! – NESHOM

答えて

1

私は、主な理由は、一定のスピードで正確な円を描いていないということです。 これに加えて、次のことも考えられます。

  • Windowsフォームのタイマーは、正確にxxミリ秒ごとに呼び出されるとは限りません。わずかに異なる期間にわたって新しい測定値を取得します
  • マウスセンサーの精度(DPI)によって、実際のマウス位置とわずかに異なる座標が表示されることがあります。
  • 標準的なゲーム用以外のUSBマウスの標準リフレッシュレートは125Hzですマウスは8msに1回)。これは、Windows自体が何らかの遅れで価値を得ることを意味します。ほとんどすべてのゲームマウスには1000Hzのリフレッシュレート(1msの遅延)があります。
+0

スピードが一定でないとは思えません。雑音のような変動は、およそ20〜30msごとに起こります。人間が手を動かすと、スピードの変化は高周波で速くなることはできません。手の動きによる速度の変化は、小さな騒音ではなく、洞の形態(第2のプロットで)に従うものである。 – NESHOM

0

ほとんどの場合、グラフの自動スケーリングが最大にデータを拡大しているため、小さな速度差は強大な大見えるので。

また、lineグラフを選択することは、データポイント間のデータを「知っている」という錯覚を生成するので、実際には良い選択ではありません。散布図(points)がより適切です。

関連する問題