在.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)
}
}
//...
答案 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解决方案的启发,我可以解决我的问题。 我已将解决方案分为两部分:
这是由我的凝视控制器(每个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);
}
}
复制光标的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);
}