• js 获取鼠标的手势方向角度


    需要获取鼠标的移动角度

    1、mousedown 确定起始点

    2、mousemove 确立相关点

    3、先计算两点的斜率,然后根据三角函数和反三角函数。转换为角度

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title></title>
    		<style type="text/css">
    			.circle{
    				position: absolute;
    				 10px;
    				height: 10px;
    				border-radius: 50%;
    				background: red;
    			}
    		</style>
    	</head>
    	<body>
    		<div class="circle" id="circle"></div>
    	</body>
    	<script type="text/javascript">
    
    function MouseGesture(opt){
      opt = opt || {};
      if(opt.wise){
        //是否 获取顺时针角度,默认为逆时针角度
        this._getDeg = this._clockWise;
      }else{
        this._getDeg = this._antiClockWise;
      }
      this.distance = opt.distance || 4; //最小有效距离
      this.vaildOffsetDeg =opt.vaildOffsetDeg || 80; //有效的差值角度,大于这个值,相当于拖拽无效
    
      this.startPoint = null; //开始的点
      this.options = {}; //其他参数  偏移角度 offsetDeg  , 偏移比例 offsetRate
    
      this.cache = null; //缓存的数据
    }
    
    
    MouseGesture.prototype._clockWise = function (start,end) {
    //获取顺时针的角度
      return 360 -  this._antiClockWise(start,end);
    }
    
    MouseGesture.prototype._antiClockWise = function (start,end) {
      //获取逆时针的旋转角度
      var x1 = start.x;
      var y1 = start.y;
      var x2 = end.x;
      var y2 = end.y;
      var deg = 0;
      if(x1 != x2){
        var k = (y1-y2)/(x1-x2);
        var a = Math.atan(k);
        deg = a * 180 /Math.PI - 90;   //弧度转角度
        deg = Math.abs(deg);
        if( x1 >= x2){
          deg = deg + 180;
        }
      }else{
        if(y2 > y1){
          deg = 0;
        }else{
          deg = 180;
        }
      }
      return Math.floor(deg);
    }
    
    
    MouseGesture.prototype.transformDeg = function (deg) {
      if(deg >= 360){
        deg = deg - 360;
      }
      if(deg < 0  ){
        deg = 360 + deg;
      }
      return deg
    }
    
    /**
     * 计算可用的角度
     * @private
     */
    MouseGesture.prototype._invalidDeg  = function (deg,offsetDeg) {
      var $this = this;
    
      var vaildOffsetDeg = $this.vaildOffsetDeg || 80;
    
      var start =  $this.transformDeg(offsetDeg - vaildOffsetDeg);
      var end = $this.transformDeg(offsetDeg + vaildOffsetDeg);
    
      if(start >= 360 - 2*vaildOffsetDeg){
        if(deg <= end){
          if(offsetDeg <= end){
            return deg - offsetDeg;
          }else{
            return deg - (360 - offsetDeg);
          }
        }
        if( deg >= start){
          if(offsetDeg > start){
            return deg - offsetDeg;
          }else{
            return (360 - deg) + offsetDeg;
          }
        }
      }else{
        if(deg <= end && deg >= start){
          return offsetDeg - deg;
        }
      }
      return false;
    }
    
    
    
    /**
     * 对外的api,设置起始点
     * @param start
     * @param options
     */
    MouseGesture.prototype.setStart = function (start,options,cache) {
      options = options || {};
      this.startPoint = start; //开始的点
      this.options =  options; //其他参数,偏移角度 offsetDeg  , 偏移比例 offsetRate
    
      this.distance = options.distance || 4; //最小有效距离
      this.vaildOffsetDeg = options.vaildOffsetDeg || 80; //有效的差值角度
    
    
      this.cache = cache || null;
    }
    
    /**
     * 结束之后,清空设置
     */
    MouseGesture.prototype.setEnd = function (opt) {
      opt = opt || {};
      this.distance = opt.distance || 4; //最小有效距离
      this.vaildOffsetDeg =opt.vaildOffsetDeg || 80; //有效的差值角度,大于这个值,相当于拖拽无效
    
      this.startPoint = null; //开始的点
      this.options = {}; //其他参数
      this.cache = null;
    }
    
    /**
     * 获取角度相关信息
     * @param end
     */
    MouseGesture.prototype.getDegInfo = function (end) {
      if(this.startPoint && end){
        var obj = {};
        var start = {
          x:this.startPoint.x,
          y:this.startPoint.y
        }
        var dis = Math.sqrt((start.x - end.x) * (start.x - end.x) + (start.y - end.y)*(start.y - end.y));
    
        obj["distance"] = dis;
        if(dis >= this.distance){
          var deg = this._getDeg(start,end);
          obj["deg"] = this.transformDeg(deg);
          obj["missX"] = end.x - start.x;
          obj["missY"] = end.y - start.y;
          return obj;
        }else{
          return false;
        }
      }else{
        return false;
      }
    }
    
    /**
     *  计算偏移量
     */
    MouseGesture.prototype.calcOffset  = function (end) {
      var $this = this;
      var obj = $this.getDegInfo(end);
      if(obj){
        var offsetDeg = $this.options.offsetDeg || 0;
        offsetDeg = $this.transformDeg(offsetDeg);
        var missDeg1  =  $this._invalidDeg(obj.deg,offsetDeg); //偏移角度,正面
        var missDeg2  =  $this._invalidDeg($this.transformDeg(obj.deg + 180),offsetDeg); //偏移角度,反面
        var missDeg =  false;
        var digital = 1;
        if(missDeg2 !== false){
          missDeg = missDeg2;
          digital = -1;
        }
    
        if(missDeg1 !== false){
          missDeg = missDeg1;
          digital = 1;
        }
    
        if(missDeg !== false){
          //有效的拖拽角度
          //计算偏移比例
          missDeg = $this.degToRadian(missDeg);
    
           var dist = digital * obj.distance * Math.cos(missDeg);
           var offsetRate =  $this.options.offsetRate || 1;  //如果是边,偏移比例应该是  1 ,如果是拐角,偏移比例应该是 Math.sqrt(2)/2
          //console.log(missDeg1,missDeg2,obj.deg,offsetDeg,dist,digital);
          return dist * offsetRate;
        }
      }
      return false;
    
    }
    
    
    MouseGesture.prototype.calcOffsetInfo = function (end) {
      var dis = this.calcOffset(end)
      if(dis !== false){
          var obj = {
            distance:dis
          }
          if(this.cache){
            obj["cache"] = this.cache;
          }
          return obj;
        }
        return false;
    }
    
    //角度转弧度
    MouseGesture.prototype.degToRadian = function (deg) {
      return deg * Math.PI/180;
    }
    
    //弧度转角度
    MouseGesture.prototype.RadianToDeg = function (radian) {
      return radian * 180/Math.PI;
    }
    
    
    
    //开始使用
    
    var circle = document.getElementById("circle");
    
    var ins =  new MouseGesture({wise:true});
    
    window.addEventListener("mousedown",function(e){
    	ins.setStart({
    		x:e.clientX,
    		y:e.clientY
    	});
    	circle.style.left  = e.clientX - 5 + "px";
    	circle.style.top  = e.clientY - 5 + "px";
    })
    window.addEventListener("mousemove",function(e){
    	if(!ins.startPoint){
    		return ;
    	}
    	var obj = ins.getDegInfo({
    		x:e.clientX,
    		y:e.clientY
    	});
    	if(obj){
    		console.log(`角度为:${obj.deg};  x方向位移:${obj.missX};  y方向位移:${obj.missY} ;两点之间的距离为:${obj.distance}`);	
    	}else{
    		console.log("无效的移动");
    	}
    })
    window.addEventListener("mouseup",function(e){
    	ins.setEnd();
    })
    		
    		
    		
    
    
    	</script>
    </html>
    

      

  • 相关阅读:
    【leetcode-100】 简单 树相关题目
    【leetcode-101】 对称二叉树
    【2】【leetcode-105,106】 从前序与中序遍历序列构造二叉树,从中序与后序遍历序列构造二叉树
    【leetcode-102,107,103】 二叉树的层次遍历
    iOS开发
    对称加密和不对称加密原理
    uiimageview 异步加载图片
    如何让IOS中的文本实现3D效果
    SDWebImage使用,图片加载和缓存
    ios 图片处理( 1.按比例缩放 2.指定宽度按比例缩放
  • 原文地址:https://www.cnblogs.com/muamaker/p/10637754.html
Copyright © 2020-2023  润新知