Saturday, June 7, 2014

Rotate a square with respect to its centre


#include <windows.h>

#include <gl/Gl.h>

#include <gl/glut.h>

#include <cmath>



int screenheight = 600;

int screenwidth = 800;

bool flag = true;

int X1,Y1,X2,Y2,click;
float len;
float m;
double angle = 30;                //The angle for the rotation (in degrees)



typedef struct{

    float x;

    float y;

}Point2D;



Point2D p1,p2,p3,p4;



void DrawLineSegment(Point2D pt1, Point2D pt2){

       glPointSize(1.0);

       glBegin(GL_LINES);

       glVertex2i(pt1.x, pt1.y);

       glVertex2i(pt2.x, pt2.y);

       glEnd();



       glPointSize(6.0);

       glBegin(GL_POINTS);

  glVertex2i(pt1.x, pt1.y);
       glVertex2i(pt2.x, pt2.y);

       glEnd();

       glFlush();

}



Point2D translate(Point2D p, float tx, float ty){

       p.x =p.x+tx; //.....wite the equations for translation

       p.y = p.y+ty; //.....wite the equations for translation

       return p;

}



Point2D  rotate(Point2D p,float ang)
{
    ang = ang * 3.14 / 180.0;                                 //angle in radians

    Point2D ptemp;

    ptemp.x = p.x * cos(ang) - p.y * sin(ang);

    ptemp.y = p.x * sin(ang) + p.y * cos(ang);

    return ptemp;

}



void myMouse(int button, int state, int x, int y) {

       if(state == GLUT_DOWN)
       {

              if(button == GLUT_LEFT_BUTTON)
              {
if(click == 0)
{
X1=x;
Y1=screenheight - y;
p1.x = X1;
                p1.y = Y1;
click++;

}
else if(click ==1)
{
click++;
glClear(GL_COLOR_BUFFER_BIT);
            Point2D p1;
            p1.x = X1;
            p1.y = Y1;
            p2.x = x;
            p2.y = screenheight - y;
            p3.x = x;
            p3.y = Y1;
            p4.x = X1;
            p4.y = screenheight - y;
DrawLineSegment(p1, p3);
            DrawLineSegment(p3, p2);
DrawLineSegment(p2, p4);
DrawLineSegment(p1, p4);
}                
             }

              else if (button == GLUT_RIGHT_BUTTON)
              {
    m=(p2.y-p1.y)/(p2.x-p1.x);
len=sqrt((p2.y-p2.x)*(p2.y-p2.x)+(p1.y-p1.x)*(p1.y-p1.x));
Point2D Translated_p1 = translate(p1,-(p1.x+p2.x)/2,-(p1.y+p2.y)/2);
Point2D Translated_p2 = translate(p2,-(p1.x+p2.x)/2,-(p1.y+p2.y)/2);
Point2D Translated_p3 = translate(p3,-(p1.x+p2.x)/2,-(p1.y+p2.y)/2);
Point2D Translated_p4 = translate(p4,-(p1.x+p2.x)/2,-(p1.y+p2.y)/2);

                     Point2D Rotated_p1 = rotate(Translated_p1,angle);
Point2D Rotated_p2 = rotate(Translated_p2,angle);
Point2D Rotated_p3 = rotate(Translated_p3,angle);
Point2D Rotated_p4 = rotate(Translated_p4,angle);

Point2D Translated_p12 = translate(Rotated_p1,(p1.x+p2.x)/2,(p1.y+p2.y)/2);
Point2D Translated_p22 = translate(Rotated_p2,(p1.x+p2.x)/2,(p1.y+p2.y)/2);
Point2D Translated_p32 = translate(Rotated_p3,(p1.x+p2.x)/2,(p1.y+p2.y)/2);
Point2D Translated_p42 = translate(Rotated_p4,(p1.x+p2.x)/2,(p1.y+p2.y)/2);

                     DrawLineSegment(Translated_p12,Translated_p32);
DrawLineSegment(Translated_p32,Translated_p22);
DrawLineSegment(Translated_p22,Translated_p42);
DrawLineSegment(Translated_p12,Translated_p42);
              }

       }

}



void myDisplay()

{

       glClearColor(1.0f, 1.0f, 1.0f, 0.0f);

       glClear(GL_COLOR_BUFFER_BIT);

       glColor3f(0.0f, 0.0f, 0.0f);

}





int main( int argc, char ** argv ) {

       glutInit( &argc, argv );

       glutInitWindowPosition( 0, 0 );

       glutInitWindowSize( 800, 600 );

       glutCreateWindow( "Draw Dots" );



       glMatrixMode( GL_PROJECTION );

       glLoadIdentity();

       gluOrtho2D( 0, 800, 0, 600 );

       glViewport(0, 0, 800, 600);



       glutMouseFunc( myMouse );

       glutDisplayFunc( myDisplay );

       glutMainLoop();



       return( 0 );

}