How to constrain movement within the area of a circle

前端 未结 4 1753
星月不相逢
星月不相逢 2020-12-03 19:27

This might be more a geometry related question, but I\'m trying to constrain a controller within an area of a circle. I know I have to touch the Math.sin() and Math.cos() me

4条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-03 19:53

    var pointerEl = document.getElementById("pointer");
    var canvasEl = document.getElementById("canvas");
    var canvas = {
        width: canvasEl.offsetWidth,
        height: canvasEl.offsetHeight,
        top: canvasEl.offsetTop,
        left: canvasEl.offsetLeft
    };
    canvas.center = [canvas.left + canvas.width / 2, canvas.top + canvas.height / 2];
    canvas.radius = canvas.width / 2;
    
    
    window.onmousemove = function(e) {
        var result = limit(e.x, e.y);
        if (!result.limit) {
            pointer.style.left = result.x + "px";
            pointer.style.top = result.y + "px";
        }
    }
    
    function limit(x, y) {
        var dist = distance([x, y], canvas.center);
        if (dist <= canvas.radius) {
            return {x: x, y: y};
        } else {
            return {limit: true};
        }
    }
    
    function distance(dot1, dot2) {
        var x1 = dot1[0],
            y1 = dot1[1],
            x2 = dot2[0],
            y2 = dot2[1];
        return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
    }  
    

    this could do the work, though the movement is not smooth....that will need more geometry knowledge...
    fiddle: http://jsfiddle.net/cRxMa/

提交回复
热议问题