Removed..

Removed…

“The angle between two points” doesn’t mean anything.
For the angle between two vectors (dx1,dy1) and (dx2,dy2), just use :
Math.toDegrees(Math.atan2(dy1,dx1)-Math.atan2(dy2,dx2))

No ?

this is ‘calculate angle of one line’ in effect.

I think this is what you want:


  public static final float calcAngle(Point p0, Point p1)
  {
    float x0 = (float)p0.getX();
    float y0 = (float)p0.getY();
    float x1 = (float)p1.getX();
    float y1 = (float)p1.getY();
    
    // op = m sin(theta)
    // ip = m cos(theta), where m = |P0| * |P1|
    float op = x1*y0-x0*y1;
    float ip = x0*x1+y0*y1;   

    return (float)Math.toDegrees(Math.atan2(op,ip));
  }

But I’m not sure. Your code returns 45 for: (0,1) & (1,0) and something near 90 for (0,1) & (10000,0). So I might be not understanding the question.

If you’re after the angle of the line that passes through points p1 and p2, then

Math.toDegrees( Math.atan2( p2.getY()-p1.getY(), p2.getX()-p1.getX() ) )

should do it.

The result will be in the range -180 to +180 degrees, measured anti-clockwise from East (see the comments here on angles in polar coordinates).

Simon

Yup, that’s exactly what atan2 is for. You don’t have to bother with checking quadrants like you’ve been doing.

Removed…

The result above makes East = 0.
If you want North to be 0, East effectively becomes -90.
That means, add 90 to the value returned.

The result above gives you a value from -180 to 180 (where 0 is east).
If you want to make it 0 to 360, effectively everything is 180 more.
That means, add 180 to the value returned.

We want to do both.

Let’s convert it into an equation.


public double convertToNorth(double angle)
{
    return angle + 90;
}
public double convertTo360(double angle)
{
    return angle + 180;
}

Doing both means you’ve got to convert it to 360 and then make sure 0 is considered north. That means:


public double doBoth(double angle)
{
    //At this point, -180 to 180 and East is 0.

    angle = convertTo360(angle);

    //At this point, 0 to 360 and West is 0.
    
    angle = convertToNorth(angle);

    //Now, 0 to 360 and North is 0.

    return angle;
}

Make sense yet? What’s the final result? That’s right. Add 270.

::slight_smile:

Removed…


public float calcAngle (Point p1, Point p2 )
{
    float f1 = (float)Math.toDegrees( Math.atan2( p1.getY()-p2.getY(), p1.getX()-p2.getX() ) );
    return (f1+270)%360;
}

Do you need to know the angle?

I often find that it’s both faster and easier to work with vectors and dot products.

One time I needed the angle specifically for where I was applying a rotation to Sprite (a goal compass). Otherwise I’ve always used vectors.

I know I’m replying to an old post but this answer is just wrong I think.

The original results would give if:
north=90
west=180 or -180
south= -90
east= 0

adding 270 gives:

north=360
west=450 or 90
south=180
east=270

the only result I can think of that would be usefull is:

north=0 or 360
east or west=270
south=180
east or west=90

edit: This gives the right answer if the original answer was “polar”:
int nonPolar= 90-((polar+180)%360)
if(nonPolar<0)
{
nonPolar=nonPolar+360;
}