Simpler way to calculate angle between two points?

I’d like to know if there is a simpler way to calculate the angle between two points.

I’m currently using this method:


public static float angle(float x1, float y1, float x2, float y2)
    {
        float dx=x2-x1,dy=y2-y1, PI=(float)Math.PI;
        double angle=0.0f;
        
        if(dx==0)
        	if(dy==0)angle=0;
        	else if(dy>0)angle=PI/2;
        	else angle=PI*3/2;
        else if(dy==0)
        	if(dx>0)angle=0;
        	else angle=PI;
        else if(dx<0)angle=Math.atan(dy/dx)+PI;
        else if(dy<0)angle=Math.atan(dy/dx)+(2*PI);
        else angle=Math.atan(dy/dx);

        return (float)angle;
    }

Seems like a awful alot for something simple as that.

I’d like the angle to be 0 at 3 o’clock, and moving clockwise it should be PI at 9 o’clock. Any ideas?

I would write it slightly different, but I think what you’ve got there is as simple as it gets when you’re starting with a pair of (x, y) coordinates.

You could change your logic around a bit so you don’t have so many if/then/else statements, but it doesn’t look like you’re doing any wasted work.

Math.atan2() does this doesn’t it?

Kev


protected double calcAngle(Point p1,Point p2) {
     return Math.atan2(p2.y-p1.y,p2.x-p1.x)*180.0/Math.PI;
}

Amazing, thanks kev and woogley. That was exactly the simplicity I was looking for :smiley: