Вычисление угла в градусах, движения мыши

Я хочу рассчитать угол перемещения мыши в градусах. Хотя я знаю, что вам не нужно перемещать мышь по прямой, я просто пытался рассчитать ее на основе начальной и конечной точек, чтобы создать хороший прямой угол.

log("ANGLE: " + getAngle(x1, y1, x2, y2)); дает странные результаты:

ANGLE: 0.24035975832980774 
mouse has stopped
ANGLE: 1.334887709726425 
mouse has stopped
ANGLE: 0.2722859857950508
mouse has stopped
ANGLE: 0.3715485780567732
mouse has stopped

код:

        $("canvas").mousemove(function(e) {                 
            getDirection(e);
            if (!set) {
                x1 = e.pageX, //set starting mouse x
                y1 = e.pageY, //set starting mouse y
                set = true;
            }   
            clearTimeout(thread);
            thread = setTimeout(callback.bind(this, e), 100);
        });

        function getAngle (x1, y1, x2, y2) {
            var distY = Math.abs(y2-y1); //opposite
            var distX = Math.abs(x2-x1); //adjacent
            var dist = Math.sqrt((distY*distY)+(distX*distX)); //hypotenuse, 
               //don't know if there is a built in JS function to do the square of a number
            var val = distY/dist;
            var aSine = Math.asin(val);
            return aSine; //return angle in degrees
        }

        function callback(e) {
            x2 = e.pageX; //new X
            y2 = e.pageY; //new Y

            log("ANGLE: " + getAngle(x1, y1, x2, y2));
            log("mouse has stopped");   
            set = false;
        }

3 ответов


ваши вычисления кажутся правильными, но проблема в том, что математика.asin (val) возвращает значения в радианах. Используйте следующую функцию для преобразования в градусы:

Math.degrees = function(radians)
{
  return radians*(180/Math.PI);
}

а затем вызовите Math.степени(математика.asin (val)) и это должно сработать!


используйте функцию atan2, чтобы получить угол в полном круге,

radians = Math.atan2(y2-y1,x2-x1);

кроме того,вы можете записать значения x1,x2,y1, y2 во время вычисления, было бы лучше просто иметь одно место, где прослеживается позиция мыши. На данный момент Вы обновляете позицию (x2,y2,t2) каждые 10 мс, но (x1,y1,t1) каждый раз, когда мышь перемещается. Это может привести к очень непредсказуемым образцом сочетания.


на Math.asin() функция возвращает угол в радианах. Если умножить на 180/pi, вы получите ответ в градусах.

кроме того, так как вы хотите более 90 градусов, вы должны уронить Math.abs вызов, так что вы можете иметь отрицательное значение для aSin.