dan_hed
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
Any help please....
Dan
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 ?
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)
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
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
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) ???
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
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
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,dRadian Sin;
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.bot tom);
pPoint[HANDLE_BL] = CPoint(rect.left,rect.bott om);
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;
}
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,dRadian
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.bot
pPoint[HANDLE_BL] = CPoint(rect.left,rect.bott
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;
}
ASKER
Hi roshmon,
Not quit it but managed to solve the problem, reminded me of the math I forgot long ago :)
Not quit it but managed to solve the problem, reminded me of the math I forgot long ago :)
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