某些场景,需要留下鼠标移动轨迹,比较合乎视觉感受,不然光标闪来闪去,会不会翻车且不说,对眼睛肯定是不好的刚好上周有小伙伴咨询后台鼠标移动的问题,虽然我没解决,也不知道最终大佬给的方案是否解决了问题。但是解决问题的思路值得探讨和学习。
1
问题背景简介
后台鼠标移动的问题,咨询了一位大佬,他给出的建议是,尝试缓慢移动,每次移动距离在10像素左右,让电脑感觉其实它自己有在慢慢移动这不是自己欺骗自己么比如从坐标10,10移动到100,100,我们可以先移动到20,20,再移动到30,30,接着40,40……一直到最后移动到100,100。
2
实现思路
后来,我给咨询的小伙伴打草稿写了一个实现思路,写的比较潦草,凑合着看一下……
我们假定从左上角移动到右下角,那自然就是x1<x2了,在这个循环里,不断往右下角挪动,每次挪动+7,+7k横纵坐标单位。
7是怎么来的?假如正方形左上角移动到右下角,那对角线长度是7*1.414,比较接近10个像素,虽横纵比例比较多变,但按操作习惯取7八九不离十吧,喜欢研究算法的可以自己研究更合乎实际的参数。
然后,还没完,7句前面漏了一个移动到x2,y2。
3
coding
Call liner_move(10,10,1000,800)
Function liner_move(x1, y1, x2, y2)
k = (y2 - y1) / (x2 - x1)
Do While x1 < x2
MoveTo x1,y1
x1 = 7 + x1
y1 = 7 * k + y1
Delay 20
Loop
MoveTo x2, y2
End Function
上面这个用到了斜率,按直线移动,每次移动7,7k个横纵坐标,看着有点牛逼是不是
不过,只能从左上角往右下角移动,如果要从右上角往左下,或者x2=x1,就傻眼了,貌似要进行非常复杂的计算,还要考虑斜率k不存在。这…………
后来灵光一现,写出下面一段简易又高大上的代码,写代码不就是为了实用么?!
Call liner_move(1000, 800, 50, 20)
Function liner_move(x1, y1, x2, y2)
dx = x2 - x1
dy = y2 - y1
Do While sqr((x1 - x2) ^ 2 + (y1 - y2) ^ 2)>10
MoveTo x1,y1
x1 = dx * 0.001 + x1
y1 = dy * 0.001 + y1
Delay 0.5
Loop
MoveTo x2, y2
End Function
简要说明一下,思路就是电脑的分辨率一般都在2000*1800以内,我们乘以0.001,也不过2*1.8。即使从0,0移动到2000,1800,每次横纵各移动2,1.8,这个距离明显小于10。
基于这个原理,我们每次移动0.001个横纵坐标差额即可,也就是代码中的0.001dx和0.001dy。当然循环会进行1000次,延时设置成0.5的话,也有500ms了,再大的话就比较慢了