使用给定坐标更平滑的过渡移动光标

时间:2014-10-09 10:08:07

标签: c# .net .net-4.5

在.NET C#程序中,我必须使用在外部控制器的事件中接收的坐标来模拟“鼠标”光标移动。

我确实根据这些坐标移动了光标。

是否有可能在两点之间以更平滑的方式移动光标?因为当我有2个离点时,就像光标的“跳跃”一样。

提前致谢。

编辑:添加代码,每次收到新坐标时都会启动此功能(aprox。每次20-30毫秒)

//...
private void MoveCursor (int x, int y){
    //Added checkup for avoiding noise between closer points 
    if (Math.Abs(Cursor.Position.X - x)>10 || Math.Abs(Cursor.Position.Y - y)>10){
        Cursor.Position = new Point(x,y)
    }
}
//...

2 个答案:

答案 0 :(得分:1)

除了我的评论,这是一个简单的解决方案(语法未经测试),我在我的一个软件中使用,我建议你测试它是否符合你的需求:

Point _targetPosition;
Point _currentPosition;

private void MoveCursor (int x, int y){
    _targetPosition = new Point(x,y);
    _currentPosition += (_targetPosition - _currentPosition)*0.08f;
    Cursor.Position = _currentPosition;
}

基本上,我保持一个目标位置,这是收到的最后一个坐标。我只将光标移动一小部分(这里是当前位置和目标之间距离的8%)。

它可以非常有效地平滑鼠标的移动,但会导致不精确和延迟,这可能是野蛮移动或方向变化所不能接受的。

考虑到60次更新/秒,因此8%的因素在我的情况下给出了良好的结果,但该因素需要根据您的数据进行调整。

答案 1 :(得分:0)

最终受到@Ndech解决方案的启发,我可以解决我的问题。 我已将解决方案分为两部分:

  1. 这是由我的凝视控制器(每个20ms aprox)引发的事件。由于凝视控制器工作的方式,我放弃了更接近的点以避免“跳跃”。

    private void MoveCursorEvent (object sender, GazePointEventArgs e){
       if (Math.Abs(Cursor.Position.X - e.X) > 40 || Math.Abs(Cursor.Position.Y - e.Y) > 40){
           MoveCursor((int)e.X, (int)e.Y);
       }
    }
    
  2. 复制光标的X,Y点的当前值在原始变量中,因为Cursor.Position可能在此过程中发生变化(检查是否第一次......)添加到上一点,前一点与当前点之间的平均距离重量为15%。并使用计算的新位置更新Cursor.Position。

    //Declare position variables
    int previousX = 0;
    int previousY = 0;
    
    
    private void MoveCursor (int newX, int newY){
    
       //If first time, set.
       if (previousX == 0)
           previousX = newX;
    
       if (previousY == 0)
           previousY = newY;
    
    
       //Calculate new position
       previousX = (int)(((newX - previousX) /2) * 0.15f);
       previousY = (int)(((newY - previousY) /2) * 0.15f);
    
       //Update position
       Cursor.Position = new Point (previousX, previousY);
    
    }