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>

  

原文地址:https://www.cnblogs.com/muamaker/p/10637754.html