[原]Javascript,我们来用js在网页中识别鼠标手势

觉得点击切换图片这样的方式不潇洒,鼠标手势呢?于是构思了一下识别鼠标手势的问题。自己去实现然后封装成了一个jquery插件。使用简洁。

下载地址:

http://download.csdn.net/download/qddnovo/7187713

 

先预览一下使用

<script src="Scripts/jquery-1.8.2.js" type="text/javascript"></script>

    <script src="Scripts/jMouseGesture.js" type="text/javascript"></script>

 

    <script type="text/javascript">

    onload = function () { 

        $("#content").mousedown(function (e) {

            var f = 0;

            $(this).jMouseGesture(e, {

                "rLine": function () { alert("");} ,

                "lLine": function () { alert(""); },

                "uLine": function () { alert(""); },

                "dLine": function () { alert(""); },

                "nike": function () { alert("Nike"); },

                "cwRound": function () { alert("顺时针圈"); },

                "rcwRound": function () { alert("逆时针圈"); },

                "uRight": function () { alert("上右"); },

                "uLeft": function () { alert("上左");}

            });

        });

    }

    </script>

先看函数的使用

$(“#被点击者”).jMouseGesture(e,{“FunName”:function(){}},isAfterEvent,noSelectWord);

函数是放在mousedown中使用的,因为这样可以让用户自己定义一些点击时要做的其他事情。jMouseGesture中只监视鼠标滑动和抬起时的动作。默认阻止,如果不阻止后面触发页面的抬起事件,可以向isAfterEvent传递falseisAfterEvent默认为true。也就是说在完成鼠标手势函数后还想使用mouseupmousemove的事件来完成某些动作,则需要传递falsenoSelectWord是是否禁止在鼠标滑动的时候选中点击块内的文字,默认为true

 

 

下面我来分析一下我的思路:

 

1.采集鼠标坐标:识别鼠标手势就是分析坐标。那么需要采集鼠标坐标,但是如果所有经过的点都采集,那么会非常占用内存,所以采用一个定时器,每隔20ms去记录一个坐标点。

 

2.分析鼠标坐标:

我的思路很简单不复杂。

分析鼠标坐标有很多方法。识别一条直线,数学上我们可以用线性回归。

一元线性回归方程如下:

根据数学公式我们可以得到回归后的方程,这就是最接近真实的那条直线了。根据直线的属性我们可以判断上下左右了。

但是我们不用。因为你知道我想画什麽形状吗。

看到过一篇使用神经网络的方法,就是边读坐标边学习,边分析。需要多次使用才能发挥好效果。很好很强大。

这些方法都是夸张。我的方法是,嗯比喻。

不是每个用户的手都有同样的状态,有的手在左右抖,有的手在上下抖,这都是计算机无法想象的。所以我们只能重新认识一下线条,来比喻……

我们由A点到B点得到AB的向量在直角坐标系中的角度,并且值域控制在[0,360)。这样我们分析时可以统一的比较每个向量。

 

比如我是这样分析Nike钩的识别的:

    我们来看主要的函数吧。

 

返回一个包含xy的坐标对象的函数

    function mouseCoords(e) {//兼容的得到鼠标当前坐标

        if (e.pageX || e.pageY) {

            return { x: e.pageX, y: e.pageY };

        }

        return {

            x: e.clientX + document.body.scrollLeft - document.body.clientLeft,

            y: e.clientY + document.body.scrollTop - document.body.clientTop

        };

}

 

 

 

    //该函数由两个点返回AB点向量的角度

    function getAngle(p1, p2) {//由当前点到下一个点这两坐标的[屏幕]标点,返回该向量的角度[0,360)

        var x = p2.x - p1.x;

        var y = p1.y - p2.y; //屏幕坐标系转为直角坐标系,x,y12的直角坐标系原点向量

        var angle = 0;

        if (x > 0) {//,四象限

            if (y == 0) {

                angle = 0; //一四象限0

            }

            else if (y > 0) {

                angle = Math.atan(y / x) * 180 / Math.PI; //一象限

            }

            else if (y < 0) {

                angle = 360 - Math.atan((-y) / x) * 180 / Math.PI; //四象限

            }

        }

        else if (x < 0) {//二三象限

            if (y == 0) {

                angle = 180; //二三象限0

            }

            else if (y > 0) {

                angle = 180 - Math.atan(y / (-x)) * 180 / Math.PI; //二象限

            }

            else if (y < 0) {

                angle = Math.atan(y / x) * 180 / Math.PI + 180; //三象限

            }

        }

        else { //x==0

            if (y > 0) {

                //90

                angle = 90;

            }

            else if (y < 0) {

                //270

                angle = 270;

            }

            else {

                //(0,0)

                angle = undefined;

            }

        }

        return angle;

    }

 

这两个函数就是主要函数,剩下的工作就是分析而已。

唯一要注意的就是,页面上可能会存在事件的冒泡,所以isAfterEvent来控制是否在mouseup后禁止mousedownmousemove。但是我们的插件使用者可能会在手势识别后继续使用mousedownmousemove这两个事件。所以传递false就可以在之后继续使用了。

 

 

 

 

By博客园.小八究.....转请注

转载于:https://www.cnblogs.com/xiaobajiu/p/3662631.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码一个多月没看,昨晚终于把错误找着了。这个演示程序能识别上下左右、西南、东南、正方形等,识别率很高。在线演示地址是ai-demo.appspot.com。 这个算法理很好理解,好比老师让学生背诵课文,老师要达到的目的是“学生背过课文”,相对应的,软件要达到的目的是“我们把鼠标向左移动”显示“左”。老师第一次对学生说,你把课文背一遍,学生磕磕绊绊,老师说不通过接着告诉同学背课文的技巧等等,然后学生回到作为继续背课文。下节课,老师又对这个学生说,你把课文背一遍,学生背还是不很流畅,老师又说不通过,然后学生再回去背……,直到最后一次背课文,老师说OK,这就算达到目的了。 同样,软件识别鼠标手势也是一样,“鼠标向左移动手势”输入到算法,程序检查算法计算结果,如算法输出果结果距离“左”差很远,那么不通过,程序就告诉算法,你要继续改进。如此循环,直到算法输出结果跟输入手势非常接近了,程序说通过了,那么就达到目的了,也就意味着这个算法就可以识别出“左”了!同样,也可以把“右”识别出来。 这个算法在神经网络叫“有监督的训练方法”也叫“反向传播”。目前我对这个算法就这么些理解了。里边还有很多东西有待研究。但是,能把书的例子改成 JavaScript版本,我就非常高兴了!有兴趣的也可以看看这本《游戏编程人工智能技术》,我自古讨厌数学,而且讨厌公式,而人工只能就需要数学,但这本书讲的确实非常好! 这个程序里边并没有训练方法,我只是把书训练好的数据提取出来,直接输入到JavaScript写的神经网络里,这样一打开程序就能直接识别,否则还得训练,就现在javascript的执行效率,这不得到猴年马月去了! 程序用了一个js游戏库,名字叫jsgamesoup,里边的画图是HTML5语法的,在IE6下支持不太好,在IE8下运行也很顺畅。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值