JS判断手势方向

1、滑动屏幕事件使用Html5 的touchstart滑动开始事件和touchend滑动结束事件。

2、方向的判断,以起点做平面坐标系,与终点连线做直线,直线与x正半轴计算角度;我们以45度角为方向分割线,如:只要滑动角度大于等于45度且小于135度,则判断它方向为向上滑。

3、使用Math.atan2来计算起点与终点形成的直线角度。

4、仔细对比标准坐标系与屏幕坐标系,我们发现,标准坐标系,上半轴为负值,要实现转换,只需要调换Y坐标起点与终于位置即可。

 

  1. <script>  
  2.   
  3.           //返回角度  
  4.           function GetSlideAngle(dx, dy) {  
  5.               returnMath.atan2(dy, dx) * 180 / Math.PI;  
  6.           }  
  7.    
  8.           //根据起点和终点返回方向 1:向上,2:向下,3:向左,4:向右,0:未滑动  
  9.           function GetSlideDirection(startX, startY, endX, endY) {  
  10.               var dy = startY - endY;  
  11.               var dx = endX - startX;  
  12.               varresult = 0;  
  13.    
  14.               //如果滑动距离太短  
  15.               if(Math.abs(dx) < 2 && Math.abs(dy) < 2) {  
  16.                   returnresult;  
  17.               }  
  18.    
  19.               varangle = GetSlideAngle(dx, dy);  
  20.               if(angle >= -45 && angle < 45) {  
  21.                   result = 4;  
  22.               }else if (angle >= 45 && angle < 135) {  
  23.                   result = 1;  
  24.               }else if (angle >= -135 && angle < -45) {  
  25.                   result = 2;  
  26.               }  
  27.               else if ((angle >= 135 && angle <= 180) || (angle >= -180 && angle < -135)) {  
  28.                   result = 3;  
  29.               }  
  30.    
  31.               returnresult;  
  32.           }  
  33.    
  34.           //滑动处理  
  35.           var startX, startY;  
  36.           document.addEventListener('touchstart',function (ev) {  
  37.               startX = ev.touches[0].pageX;  
  38.               startY = ev.touches[0].pageY;    
  39.           }, false);  
  40.           document.addEventListener('touchend',function (ev) {  
  41.               var endX, endY;  
  42.               endX = ev.changedTouches[0].pageX;  
  43.               endY = ev.changedTouches[0].pageY;  
  44.               var direction = GetSlideDirection(startX, startY, endX, endY);  
  45.               switch(direction) {  
  46.                   case 0:  
  47.                       alert("没滑动");  
  48.                       break;  
  49.                   case 1:  
  50.                       alert("向上");  
  51.                       break;  
  52.                   case 2:  
  53.                       alert("向下");  
  54.                       break;  
  55.                   case 3:  
  56.                       alert("向左");  
  57.                       alert("!");  
  58.                       break;  
  59.                   case 4:  
  60.                       alert("向右");  
  61.                       break;  
  62.                   default:             
  63.               }  
  64.           }, false);  
  65.      
  66.             
  67.       </script>  

转载于:https://my.oschina.net/u/2962717/blog/796602

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码一个多月没看,昨晚终于把错误找着了。这个演示程序能识别上下左右、西南、东南、正方形等,识别率很高。在线演示地址是ai-demo.appspot.com。 这个算法原理很好理解,好比老师让学生背诵课文,老师要达到的目的是“学生背过课文”,相对应的,软件要达到的目的是“我们把鼠标向左移动”显示“左”。老师第一次对学生说,你把课文背一遍,学生磕磕绊绊,老师说不通过接着告诉同学背课文的技巧等等,然后学生回到作为继续背课文。下节课,老师又对这个学生说,你把课文背一遍,学生背还是不很流畅,老师又说不通过,然后学生再回去背……,直到最后一次背课文,老师说OK,这就算达到目的了。 同样,软件识别鼠标手势也是一样,“鼠标向左移动手势”输入到算法中,程序检查算法计算结果,如算法输出果结果距离“左”差很远,那么不通过,程序就告诉算法,你要继续改进。如此循环,直到算法输出结果跟输入手势非常接近了,程序说通过了,那么就达到目的了,也就意味着这个算法就可以识别出“左”了!同样,也可以把“右”识别出来。 这个算法在神经网络中叫“有监督的训练方法”也叫“反向传播”。目前我对这个算法就这么些理解了。里边还有很多东西有待研究。但是,能把书中的例子改成 JavaScript版本,我就非常高兴了!有兴趣的也可以看看这本《游戏编程中的人工智能技术》,我自古讨厌数学,而且讨厌公式,而人工只能就需要数学,但这本书讲的确实非常好! 这个程序里边并没有训练方法,我只是把书中训练好的数据提取出来,直接输入到JavaScript写的神经网络里,这样一打开程序就能直接识别,否则还得训练,就现在javascript的执行效率,这不得到猴年马月去了! 程序用了一个js游戏库,名字叫jsgamesoup,里边的画图是HTML5语法的,在IE6下支持不太好,在IE8下运行也很顺畅。
好的,摇杆控制方向可以使用 HTML5 的 canvas 绘制一个圆形的摇杆,并在其中心绘制一个小圆点,然后监听摇杆的移动事件,根据移动的距离和方向计算出需要控制的方向,具体实现代码如下: HTML 代码: ```html <canvas id="joystick" width="200" height="200"></canvas> ``` JavaScript 代码: ```javascript const canvas = document.getElementById('joystick'); const ctx = canvas.getContext('2d'); // 绘制摇杆 function drawJoystick(x, y) { // 清空画布 ctx.clearRect(0, 0, canvas.width, canvas.height); // 绘制摇杆背景 ctx.beginPath(); ctx.arc(canvas.width / 2, canvas.height / 2, 80, 0, Math.PI * 2); ctx.strokeStyle = 'gray'; ctx.stroke(); // 绘制摇杆 ctx.beginPath(); ctx.arc(x, y, 40, 0, Math.PI * 2); ctx.fillStyle = 'gray'; ctx.fill(); // 绘制摇杆中心点 ctx.beginPath(); ctx.arc(canvas.width / 2, canvas.height / 2, 10, 0, Math.PI * 2); ctx.fillStyle = 'white'; ctx.fill(); } // 监听摇杆移动事件 canvas.addEventListener('touchmove', (event) => { event.preventDefault(); const touch = event.touches[0]; const x = touch.pageX - canvas.offsetLeft; const y = touch.pageY - canvas.offsetTop; const distance = Math.sqrt(Math.pow(x - canvas.width / 2, 2) + Math.pow(y - canvas.height / 2, 2)); // 判断是否超出范围 if (distance < 80) { drawJoystick(x, y); // 计算角度和方向 const angle = Math.atan2(y - canvas.height / 2, x - canvas.width / 2); const direction = angle * 180 / Math.PI; // 触发控制事件 control(direction); } }); // 初始化摇杆 drawJoystick(canvas.width / 2, canvas.height / 2); ``` 手势控制角度可以使用 Hammer.js 库,监听页面的手势事件,根据手势方向计算出需要控制的角度,具体实现代码如下: HTML 代码: ```html <div id="gesture"></div> ``` JavaScript 代码: ```javascript const gesture = new Hammer(document.getElementById('gesture')); // 监听手势事件 gesture.on('pan', (event) => { const direction = event.direction; // 根据手势方向计算角度 let angle; switch (direction) { case Hammer.DIRECTION_LEFT: angle = 180; break; case Hammer.DIRECTION_RIGHT: angle = 0; break; case Hammer.DIRECTION_UP: angle = -90; break; case Hammer.DIRECTION_DOWN: angle = 90; break; default: angle = null; break; } // 触发控制事件 if (angle !== null) { control(angle); } }); ``` 其中 `control(angle)` 是你需要自己实现的控制函数,用于控制方向或角度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值