【问题标题】:Noise in velocity of cursor that is recorded in C#用 C# 记录的光标速度噪声
【发布时间】:2016-12-25 07:27:38
【问题描述】:

当我使用 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 分量)与时间的关系,我将得到以下图:

然后我测量速度 (DeltaX/DeltaT) 并再次绘制它与时间的关系。然后我会得到以下情节:

现在我的问题是:为什么速度是嘈杂的/锯齿状的?

【问题讨论】:

  • 因为你没有匀速移动光标?
  • 可能是由于计时器本身的刻度长度吗?编辑:请参阅下面的@dlxeon 非常准确的答案。
  • @RyanPeters 这些图是根据录制时间绘制的。所以,刻度长度不是问题!
  • @PaulF 我没有以稳定的速度移动光标,这就是为什么您会看到速度的巨大变化以窦的形式出现。但是,我说的是高频的微小波动,这不可能是因为手部的动作。
  • 记住你的高中数学,你正在做微分。每次输入数据中出现凹凸或褶皱时,您都可以期待峰值或谷值。但是最大的错误来源是不可见的,您通过鼠标点绘制平滑曲线来隐藏它。大问题是你只能得到整数值,它实际上不是一条平滑的曲线。你总是有一个 +/- 0.5 的系统错误。并且区分逐步变化会产生无限的速度。只有通过您选择的 dT 才能对其进行检查。您必须做的是首先通过数据插入一个平滑函数。

标签: c# plot cursor noise


【解决方案1】:

我认为主要原因是您没有以恒定的速度进行精确的圆周运动。 除此之外,我认为以下是可能的:

  • 不能保证每 xx 毫秒准确地调用 Windows 窗体计时器。因此,您会在略有不同的时间段内获得新的测量结果
  • 鼠标传感器精度 (DPI) 可能会导致坐标与实际鼠标位置略有不同
  • 标准非游戏 USB 鼠标的刷新率通常为 125Hz(每 8 毫秒从鼠标获取一次值)。这意味着 Windows 本身会延迟获得价值。几乎所有游戏鼠标都具有 1000Hz 刷新率(1ms 延迟)。

【讨论】:

  • 我不认为速度不恒定是问题所在。像噪音一样的波动大约每 20-30 毫秒发生一次。当一个人移动他/她的手时,速度的变化不可能这么快而且频率很高。由手部运动引起的速度变化是窦状结构(在第二个图中),而不是微小的噪音。
【解决方案2】:

很可能是因为图表的自动缩放将数据放大到最大,因此小的速度差异看起来非常大。

另外选择line 图表也不是一个好的选择,因为它会产生“了解”数据点之间数据的错觉。散点图 (points) 更合适,imo。

【讨论】:

    猜你喜欢
    • 2013-08-16
    • 2014-06-18
    • 2010-12-10
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多