Link to home
Start Free TrialLog in
Avatar of dan_hed
dan_hedFlag for Afghanistan

asked on

How to rotate a rectangle OnMousemove

I have an object describing a rectangle using 4 CPoints for its corners, when I'm over a corner I want to hold down the mouse and rotate the object around it's center by moving the mouse.

Any help please....

Dan
Avatar of Roshan Davis
Roshan Davis
Flag of United States of America image

Hi,

you can use the formula for rotation

x' = (x * cos A) - (y * sin A)
y' = (x * sin A) + (y * cos A)

Try these links also

1). http://www.codeproject.com/gdi/setworldtransform().asp - Using SetWorldTransform() to rotate basic shapes by any angle
2). http://www.codeproject.com/gdi/rotated_dc.asp - Rotate your graphics

Good Luck
Avatar of dan_hed

ASKER

hmm... right
That's if I know the angle, but what if I have only (x0, y0) - center of rotation, and the old and new x,y ???
How do I get the angle between the two lines ?
 
You can use the slope equation

Slope = (y'- y)/(x'- x)
Try this code snippet

dy = y2 - y1;
dx = x2 - x1;

assert (!(dx == 0.0 && dy == 0.0));

if (dx == 0.0)  /* Special case, vertical line */
{
  if (dy > 0.0)
    return 0.0;
  else
    return 180.0;
}
if (dy == 0.0) /* Special case, horizontal line */
{
  if (dx > 0.0)
    return 90.0;
  else
    return 270.0;
}
if (dx > 0.0)
  return 90.0 - atan(dy/dx) * (180 / M_PI);
else if (dx < 0.0)
  return 270.0 - atan(dy/dx) * (180 / M_PI);

Good Luck
Avatar of dan_hed

ASKER

Yo man,

That's all fine but my math is a bit rusty, know, the slope, know the formula for rotation.
But... how do I get the angle (rads / degrees) ???
ASKER CERTIFIED SOLUTION
Avatar of Roshan Davis
Roshan Davis
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of freewell
freewell

Try to call the function as following in your code:

CPoint pt[HANDLE_MAX];
CRect rect(10,10,100,100);

Rotate(rect,90,pt);
...

#include <math.h>
#define HANDLE_MAX 4
#define HANDLE_TL 0
#define HANDLE_TR 1
#define HANDLE_BL 2
#define HANDLE_BR 3

BOOL Rotate(const RECT rect,const int nAngle,LPPOINT pPoint) const
{
      int i;
      CPoint pt,ptCenter;
      double dRadian,dRadianCos,dRadianSin;
      const double PI = 3.141592654;

      ptCenter.x = int((rect.left + rect.right) / 2);
      ptCenter.y = int((rect.top + rect.bottom) / 2);
      dRadian = PI * double(nAngle) / double(180);
      dRadianCos = cos(dRadian);
      dRadianSin = sin(dRadian);

      pPoint[HANDLE_TL] = CPoint(rect.left,rect.top);
      pPoint[HANDLE_TR] = CPoint(rect.right,rect.top);
      pPoint[HANDLE_BR] = CPoint(rect.right,rect.bottom);
      pPoint[HANDLE_BL] = CPoint(rect.left,rect.bottom);

      for(i=0;i<HANDLE_MAX;i++)
      {
            pt.x = pPoint[i].x - ptCenter.x;
            pt.y = pPoint[i].y - ptCenter.y;

            pPoint[i].x = int(double(ptCenter.x) + double(pt.x)*dRadianCos - double(pt.y)*dRadianSin);
            pPoint[i].y = int(double(ptCenter.y) + double(pt.x)*dRadianSin + double(pt.y)*dRadianCos);
      }

      return TRUE;
}
Avatar of dan_hed

ASKER

Hi roshmon,
Not quit it but managed to solve the problem, reminded me of the math I forgot long ago :)