finding angles 0-360

前端 未结 10 1770
清酒与你
清酒与你 2020-12-25 15:16

Need help with a math issue: i need to get the true angle from 0 degrees using x and y cordinates im using this at the moment:

Math.atan((x2-x1)/(y1-y2))/(Ma         


        
相关标签:
10条回答
  • 2020-12-25 15:59

    Math.atan limits you to the two rightmost quadrants on the unit circle. To get the full 0-360 degrees:

    if x < 0 add 180 to the angle
    else if y < 0 add 360 to the angle. 
    

    Your coordinate system is rotated and inverted compared to mine (and compared to convention). Positive x is to the right, positive y is up. 0 degrees is to the right (x>0, y=0, 90 degrees is up (x=0,y>0) 135 degrees is up and to the left (y>0, x=-y), etc. Where are your x- and y-axes pointing?

    0 讨论(0)
  • 2020-12-25 15:59

    The atan function only gives half the unit circle between -pi/2 and +pi/2 (0 on x axis), there is another library function that can give the whole unit circle between -pi and + pi, atan2

    I would think you are better of using atan2 to get the right quadrant rather than branching yourself, then just scale as you have been, something like

    Math.atan2(y2 - y1, x2 - x1) * 180 / Math.PI + 180
    

    The multiply by 180 over pi is just the scale from radians to degrees as in the question (but with the division by a division simplified), the +180 makes sure its always positive i.e. 0-360 deg rather than -180 to 180 deg

    0 讨论(0)
  • 2020-12-25 16:01
    angle = Math.atan(this.k) * 180 / Math.PI;
    angle = 180 - (angle < 0 ? 180 + angle : angle);
    angle = p2.Y > p1.Y || (p2.Y == p1.Y && p2.X > p1.X) ? 180 + angle : angle;
    
    0 讨论(0)
  • 2020-12-25 16:02

    so with a single decesion (i hope this ugly basiclike notation explains it):

    IF x = 0 THEN

    360degree = 270 - (SIGN(x) + 1) * 90

    ELSE

    360degree = MOD(180 + (SIGN(y) + 1) * 90 + ATAN(x/y) , 360)

    ENDIF

    to draw a full circle from north 0degree to 360degree clockwise:

    x=SIN(0to360) y=COS(0to360)

    cheers, Lev

    0 讨论(0)
  • 2020-12-25 16:02
    function angle(x1,y1,x2,y2)
    {
    eangle = Math.atan((x2-x1)/(y1-y2))/(Math.PI/180)
    if ( angle > 0 )
    {
      if (y1 < y2)
        return angle;
      else
        return 180 + angle;
    } else {
      if (x1 < x2)
        return 180 + angle;
      else
        return 360 + angle;
    }
    }
    
    0 讨论(0)
  • 2020-12-25 16:03

    The answers of @jilles de wit and @jk. led me on the right path but for some reason did not provide the right solution for my problem that i think is very similar to the original question.

    I wanted to get up = 0°, right = 90°, down = 180°, left = 270° as in aeronautical navigation systems.

    Presuming the question was referring to canvas drawing i reached this solution:

    I first translated the canvas origin using ctx.translate(ctx.canvas.width / 2, ctx.canvas.height / 2). I also halved e.offsetX and e.offsedY i got from a mouse event on the canvas to get x and y with the same coordinate system as the canvas.

    let radianAngle = Math.atan2(y, x);    // x has the range [-canvas.width/2 ... +canvas.width/2], y is similar
    let northUpAngle = radianAngle * 180 / PI + 90;    // convert to degrees and add 90 to shift the angle counterclockwise from it's default "left" = 0°
    if (x < 0 && y < 0) {    // check for the top left quadrant
        northUpAngle += 360;    // add 360 to convert the range of the quadrant from [-90...0] to [270...360] (actual ranges may vary due to the way atan2 handles quadrant boundaries)
    }
    northUpAngle.toFixed(2)    // to avoid getting 360° near the "up" position
    

    There might be a more concise solution using the modulo operation but i could't find it.

    0 讨论(0)
提交回复
热议问题