100分求算法!(100分)

  • 主题发起人 主题发起人 RedCat
  • 开始时间 开始时间
R

RedCat

Unregistered / Unconfirmed
GUEST, unregistred user!
定时向一个循环链表中存储鼠标的位置,如何判断鼠标的运动状态?
(如顺时针绕环,逆时针绕环,左右、上下运动等等)
 
用hook取mouse消息,取鼠标位置判断
 
如果不想用hook, 那么放一个全屏的form, 直接判断鼠标在这个form上的位置.
 
查我个人信息(点我名字),有个MOUSE HOOK的题目
 
人家不是要得到鼠标的位置,而是要判断运动状态。
假设是判断50个坐标点的运动状态。
第一步先区别绕环运动和直线运动,顺序地取相邻两个
坐标的x,y方向绝对差值,然后加起来。
x:=abs(x1-x2)+abs(x3-x4).....abs(x49-x50)
y:=abs(y1-y2)+abs(y3-y4).....abs(y49-y50)
1.如果x方向的累加值远大于y方向说明是左右运动.
2.如果y方向的累加值远大于x方向说明是上下运动.
3.如果x,y的的累加值相差不远说明是绕环运动。
4.如果x,y的的累加值比较小说明没有运动。
具体多少叫远大于要实际试验了
第二步要区别顺时针绕环和逆时针绕环。主要思想是判断
两点之间斜率的变化。
K 为相邻两点的斜率
k[1]:=(y2-y1)/(x2-x1)....k[49]:=(y50-y49)/(x50-x49)
deasil:=0;anticlockwise:=0;
for i:=2 to 49
if k>k[i-1] then
deasil:=deasil+1
else
anticlockwise:=anticlockwise+1;
1.如果 deasil>>anticlockwise 就是顺时针绕环
2.如果 deasil<<anticlockwise 就是逆时针绕环
3.如果 deasil~=anticlockwise 画8字
这里的坐标系是左上角,如果换成标准的坐标系那么k[1]:=-(y2-y1)/(x2-x1)
判断条件为 if k<k[i-1] then
deasil:=deasil+1
else
anticlockwise:=anticlockwise+1;
要注意计算斜率可能会碰到除0错误。
 
呵呵,是想作个mouse热键之类的程序吧,呵呵
我看过一个VB写的原程序,可惜不知在哪里看到的了.
好象是在朋友的机器上
:P
 
没错,就是鼠标热键的程序
注意,我想知道判断运动状态
urus的方法我也想过,但我用的是循环链表
如果这样做的话,需要解决从何点开始判断的问题!
不知各位还有何好的想法,说出来听听?
 
好玩!
循环链表存储的点数是有一定范围的,
所以你取点的时候是不是可以个一定
的时间,这个时间就是你鼠标热键的
灵敏度,然后根据灵敏度来确定循环
链表的长度,灵敏度大则表长,否则
表短,然后根据相邻的点之间的斜率的
增减来判断,urus说的应该可以....
大家说如何?
 
链表的起点应该定!
 
urus:
你不会和u.are.u有什么关系吧! 8)
 
zx is right.
But I stilldo
n't know how to determinate the start point.
 
链表只是一个存储的形式,
它保证的是存储最近一段
时间的坐标信息.
而运算可以每添加一个坐
标信息时就算一次,从最
老的点开始....
 
咦,怎么没贴全。这是下面的
3.如果 deasil~=anticlockwise 画8字
这里的坐标系是左上角,如果换成标准的坐标系那么k[1]:=-(y2-y1)/(x2-x1)
判断条件为 if k<k[i-1] then
deasil:=deasil+1
else
anticlockwise:=anticlockwise+1;
要注意计算斜率可能会碰到除0错误。
我觉的不用什么hook来做,因为时间性不强。建一个线
程每50毫秒判断一次鼠标位置,每次向前判断20点的的
数据,这样可以保证这个动作是一秒钟内发生的。当每
判断出一次运动,所有数据清零
 
我觉的不用什么hook来做,建一个线程每50毫秒判断
一次鼠标位置,每次向前判断20点的的数据,这样可以
保证这个动作是一秒钟内发生的。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
835
SUNSTONE的Delphi笔记
S
S
回复
0
查看
765
SUNSTONE的Delphi笔记
S
D
回复
0
查看
744
DelphiTeacher的专栏
D
后退
顶部