2011-08-29 3 views
4

JavaScript 질문.수평선과 두 점을 통과하는 선 사이의 각도 계산

다음은 몇 가지 문제가있는 루틴입니다. 문제가 무엇입니까? 두 점이 주어진 함수는 가로 축과 두 점 (X1, Y1) 및 (X2, Y2)가 포함 된 선 사이에 형성된 각도 (라디안)를 반환합니다.

function GetAngle(X1, Y1, X2, Y2) { 
    if (Y2 == Y1) { 
     return (X1 > X2) ? Math.PI : 0; 
    } 
    if (X2 == X1) { 
     return (Y2 > Y1) ? Math.PI/2 : 1.5*Math.PI; 
    } 
    var tangent = (X2 - X1)/(Y2 - Y1); 
    var ang = Math.atan(tangent); 
    if (Y2-Y1 < 0) ang -= Math.PI; 
    return ang; 
} 
+1

... 무엇이 문제입니까? 그것이주는 오류 메시지는 무엇입니까? 당신이 그것을 실행할 때 얻는 각도? – woliveirajr

답변

9

더 편리하면 Math.atan2을 사용하지 않는 이유는 무엇입니까? 두 숫자가 음수 일 때 자동으로 올바르게 처리하고 (분할 정보가 손실 됨) 가장자리 케이스에 대한 올바른 값을 반환합니다.

var angle = Math.atan2(Y2 - Y1, X2 - X1); 


// these return differently, even though 0/-1 === 0/1 
Math.atan2(0, -1); // Math.PI 
Math.atan2(0, 1); // 0 

// same thing: 1/1 === -1/-1 
Math.atan2(1, 1); // Math.PI/4 
Math.atan2(-1, -1); // -Math.PI * 3/4 


// other values 
Math.atan2(1, 1); // Math.PI/4 
Math.atan2(1, 0); // Math.PI/2 
Math.atan2(-1, 0); // -Math.PI/2 
1

이 함수는 탄젠트의 역수를 계산합니다.

var tangent = (Y2 - Y1)/(X2 - X1); 

그러나 pimvdb가 언급 한대로 Math.atan2()을 사용하는 것이 좋습니다.

0

도움을 주셔서 감사합니다! 나는 atan2를 시도했지만 어떤 상황에서는 제대로 작동하지 않았다. 나는이 문제를 다루기 위해 내 자신의 기능을 썼다. 여기있어. 훌륭하게 작동합니다.

function calcAngle(p1, p2) { 
     // Returns the angle points p1 and p2 form with the horizontal. 
     if (p2.x > p1.x) { 
      // quad 1 or 2 
      if (p2.y > p1.y) { 
       // quad 2 
       return arctan(p1, p2)} 
       // should be 1-90 
      else { 
       if (p2.y==p1.y) { 
        return 0} 
       else { 
        // quad 1 
        return 2*Math.PI+arctan(p1, p2) 
        // 270-360 
       } 
      } 
     } 
     else {  
      if (p2.x==p1.x) { 
       // atan undefined 
       if (p2.y == p1.y) { 
        return 0} 
       else { 
        if (p2.y > p1.y) { 
         return Math.PI/2} 
        else { 
         return 1.5*Math.PI 
        } 
       } 
      } 
      else { 
       // else { p2.x < p1.x 
       // quad 3 or 4 
       if (p2.y == p1.y) { 
        return Math.PI} 
       else { 
        if (p2.y > p1.y) { 
         // quad 3 
         return Math.PI + arctan(p1, p2)} 
         // 90-180 
        else { 
         // quad 4 
         return Math.PI+ arctan(p1, p2) 
         // 180-270 
        } 
       } 
      } 
     } 
    } 


    function arctan(p1, p2) { 
     // Returns the arcTan of points p1 and p2. 
     rat= (p2.y-p1.y)/(p2.x-p1.x) 
     inradians=Math.atan(rat) 
     //indegrees=180*inradians/Math.PI 
     return inradians 
    } 
관련 문제