2014-04-10 5 views
7

마우스 이동 각도를도 단위로 계산하고 싶습니다. 마우스를 직선으로 움직일 필요가 없다는 것을 알고 있지만 시작점과 끝점을 기준으로 마우스를 계산하여 멋진 직각을 만들려고했습니다.마우스 이동 각도 계산 각도

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; 
     } 

답변

5

계산이 올바르지 만 문제는 Math.asin (val)이 라디안 단위의 값을 반환한다는 것입니다.

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

을 그리고 Math.degrees (Math.asin (발))를 호출하고 그 작동합니다 : 도로 변환하려면 다음 함수를 사용합니다!

1

Math.asin() 함수는 라디안 각도를 반환합니다. 180/pi을 곱하면 그 답을도로 얻을 수 있습니다.

또한 90도 이상을 필요로하므로 Math.abs 호출을 삭제하여 aSin에 음수 값을 지정할 수 있습니다.

+0

아 죄송합니다. 180/PI로 라디안을 곱하면 왜 각도가 부여되는지 말해 줄 수 있습니까? – Growler

+0

이것은 라디안으로 학위를 정의한 것입니다. http://en.wikipedia.org/wiki/Radian#Conversion_between_radians_and_degrees – gcochard

+0

롤 나는 그것을보아야했습니다. 마지막으로, 저는 원을 중심으로 움직이는 것을 보았습니다. 항상 '90'이라는 용어로 각도를 나타냅니다. 예 : 원점에서 오른쪽 위 사분면으로 이동하면 0 ~ 90도 범위를 나타낼 수 있습니다. 원점에서 오른쪽 아래 사분면으로 이동하면 도수가 270-360에이를 것으로 예상됩니다. 이 문제를 어떻게 해결할 수 있습니까? – Growler

2

전체 원의 각도를 얻기 위해 ATAN2 함수를 사용하여, 또한

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

, 당신은 X1, X2, Y1, 계산시 Y2의 값을 기록 할 수 있습니다, 그것은 것 마우스 위치가 추적되는 곳을 한 곳으로 만드는 것이 좋습니다. 현재 마우스를 움직일 때마다 (x2, y2, t2) 10ms마다 (x1, y1, t1) 위치를 업데이트합니다. 이로 인해 예측할 수없는 샘플 조합이 발생할 수 있습니다.