鼠标手势(Mouse Gesture)的C#实现源代码

来源:互联网 发布:索尼l36h没数据网络 编辑:程序博客网 时间:2024/05/02 00:58

再来一篇实例讲解(PS:该篇实例改编自Flash AS当中的一个鼠标手势库,具体出处我忘记了,这代码写的有点久了,好像2008年左右写的)。

 

鼠标手势是一个种比较好玩的东西,其应用并不算很广泛,但是研究起来相当好玩。在遨游浏览器当中,你可以看到鼠标手势的应用,例如你按住鼠标右键,然后画一个L,可以关闭当前的标签,从右向左画一横,可以后退,FireFox当中也支持鼠标手势。还有一些游戏中也用到了该技术,例如《三位一体》,还有NDS上的《恶魔城》等等。当然,手写输入发也算是一种鼠标手势,不过其实现方式不知道与我下面将的是否相同,这个没有研究过。

 


其实鼠标手势玩的就是算法,建立弧度向量表,根据鼠标轨迹的点计算方向,然后与预定义的鼠标手势进行对比,取出最相似的一组。这几个步骤当中都要用到不同的算法。

 

首先是弧度向量表,以八个方向的向量划分弧度,并按一定的精度建立一个弧度向量表,用0-7表示8个方向,-1表示“.”。如下图所示:

 

方向向量示意图

 

此时,我们就可以根据这个方向建立手势数据了,例如:

A可以表示为71

B可以表示为260123401234

I可以表示为2(与1没有区分开,程序带中的代码也是如此,如果需要区分开,可以用6表示1,即从下往上画一竖,不过这样不符合人们的输入习惯了)

看到这里,相信基本原理也大概明白了,就是预先建立手势数据,然后通过捕获鼠标轨迹的点来建立方向数组,然后与手势数据的数组进行对比。

 

 

接下来从流程上开始说(实例当中的流程):

1.捕获鼠标输入,当鼠标左键按下,开始进行鼠标轨迹记录。

2.以一定时间间隔记录鼠标移动过的点,并通过前后两点的向量计算出向量所对应的方向编号,并添加到数组当中。

3.鼠标左键抬起时结束输入捕获(这里就必须是连笔输入,如果你不希望连笔输入,可以在设定一个时间间隔,在这个时间间隔内如果鼠标按下,则继续捕获),开始对输入的手势数据与所有预先建立的手势数据进行对比,这里采用了Levenshtein算法计算数组相似度,这个算法稍微有点复杂,这里就不解释了,有兴趣的可以去这个网站看看。同时,在对比过程当中,对一些容易混淆的手势进行了精度修正(源代码中的MouseGesture的GestureMatchEvent就是对手势进行精度修正)。

4.打印符合条件的字符。

 


源代码可以在这里下载。其中有两个工程,MouseGestureLib是鼠标手势的库,MouseGesture是一个利用该库实现的识别26个字母+0-9个数字的Demo,有使用说明。

 

代码当中可以优化的地方很多,这篇代码是刚学了C#不久后写的,注释不是太全,见谅。(每次回过头去看自己以前写的代码都觉得有点好笑,心想:“嘿,那个时候我怎么会那样想呢,怎么能那样做呢?”,呵呵,相当的搞笑)