1

I am trying to make an image move towards my mouse pointer. Basically, I get the angle between the points, and move along the x axis by the cosine of the angle, and move along the y axis the sine of the angle.

However, I don't have a good way of calculating the angle. I get the difference in x and the difference in y, and use arctangent of Δy/Δx. The resulting angle in quadrant 1 is correct, but the other three quadrants are wrong. Quadrant 2 ranges from -1 to -90 degrees. Quadrant 3 is always equal to quadrant 1, and quadrant 4 always equals quadrant 4. Is there an equation that I can use to find the angle between the two points from 1-360 degrees?

Note: I cannot use atan2(), and I do not know what a vector is.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Indigo2003
  • 27
  • 11

4 Answers4

1
// This working code is for Windows HDC mouse coordinates gives the angle back that is used in Windows. It assumes point 1 is your origin point
// Tested and working on Visual Studio 2017 using two mouse coordinates in HDC.
//
// Code to call our function.
float angler = get_angle_2points(Point1X, Point1Y, Point2X, Point2Y);


// Takes two window coordinates (points), turns them into vectors using the origin and calculates the angle around the x-axis between them.
// This function can be used for any HDC window. I.e., two mouse points.
float get_angle_2points(int p1x, int p1y, int p2x,int p2y)
{
    // Make point1 the origin, and make point2 relative to the origin so we do point1 - point1, and point2-point1,
    // Since we don’t need point1 for the equation to work, the equation works correctly with the origin 0,0.
    int deltaY = p2y - p1y;
    int deltaX = p2x - p1x; // Vector 2 is now relative to origin, the angle is the same, we have just transformed it to use the origin.

    float angleInDegrees = atan2(deltaY, deltaX) * 180 / 3.141;

    angleInDegrees *= -1; // Y axis is inverted in computer windows, Y goes down, so invert the angle.

    //Angle returned as:
    //                      90
    //            135                45
    //
    //       180          Origin           0
    //
    //
    //           -135                -45
    //
    //                     -90


    // The returned angle can now be used in the C++ window function used in text angle alignment. I.e., plf->lfEscapement = angle*10;
    return angleInDegrees;
}
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
  • Y is inverted , Y axis pointing down is positive so invert Y values. So instead of `int deltaY = p2y - p1y;` use `int deltaY = p1y- p2y;` – Pratme Apr 07 '23 at 17:59
0

If you're unable to use atan2() directly, you could implement its internal calculations on your own:

atan2(y,x) =    atan(y/x)   if x>0
                atan(y/x) + π   if x<0 and y>0
                atan(y/x) - π   if x<0 and y<0
0

The answers regarding atan2 are correct. For reference, here is atan2 in Scratch block form:

scratch custom block

PullJosh
  • 735
  • 7
  • 21
0

This is the code I use, and it seems to work perfectly fine.

atan(x/y) + (180*(y<0))

atan(x/y) + (180*(y<0))

where X is the difference between the Xs of the points (x2 - x1), and Y is the difference between the Ys (y2 - y1).

atan((x2-x1)/(y1-y2)) + (180*((y1-y2)<0))

atan((x2-x1)/(y1-y2)) + (180*((y1-y2)<0))

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Ian Os
  • 1