var x = e.offsetX - elem.spec.x/2;//鼠标进入的X坐标-盒子宽度的一半
var y = e.offsetY - elem.spec.y/2;//鼠标进入的y坐标-盒子宽度的一半
var direction = (Math.round((Math.atan2(y, x) * (180/Math.PI) + 180)/90) + 3)%4;
direction=0 从top进入
direction=1 从right进入
direction=2 从bottom进入
direction=3 从left进入
下面解释一下每一步
默认情况下,盒子的原点在左上角位置O,为了方便计算鼠标进入的角度值,可以用鼠标的进入位置的x,y减去盒子的width,height,这样就把原点转换为O',即为盒子的中心,鉴于负数不容易计算,可以全部叫上180度;从图中可以看出
top的角度范围是 45 ~ 135;
right的角度范围是 135 ~ 225;
bottom的角度范围是 225 ~ -315;
left的角度范围是 315 ~ 360 0 ~ 45 ;
除以90之后
top的范围变为 0.5 ~ 1.5
right的范围变为 1.5 ~ 2.5
bottom的范围变为 2.5 ~ 3.5
left的范围变为 3.5 ~ 4 0 ~ 0.5
如果对结果四舍五入处理,那么
在top进入的值将是 1
在right进入的值将是 2
在bottom进入的值将是 3
在left进入的值将是 4 或者 0
那么 + 3取余4之后就变成
在top进入的值将是 0
在right进入的值将是 1
在bottom进入的值将是 2
在left进入的值将是 3
可以发现每个方向都有有唯一的值,后面判断的时候就可以直接使用