#include <GL/glut.h> 

#include <math.h>  



const  double  pi2 = 6.28318530718; 



/* Pendulum constants */

const  double  omega = 1.0;

const  double  initial_angle = -1.0;

const  double  cord_length = 0.75;



/* Time variables */

const  double  tic  = 0.025;

static double  time = 0.0;





void idle(void){

  /* Increase time by 1 tic */  

  time += tic;

  

  /* Redraw the display */

  glutPostRedisplay();

};





void winInit(void){

  /* Set orthographic 2D coordinate system */

  gluOrtho2D(-1.0, 1.0, -1.5, 0.5);

};





void display(void){

  static double radius = 0.05;

  const double delta_theta = pi2/20;

  double xcenter , ycenter;  

  double x, y;

  double theta = 0.0;



  double current_angle = cos(omega * time);



  glColor3f(0.0, 0.0, 0.0);

  glClear(GL_COLOR_BUFFER_BIT);

  glColor3f(1.0, 1.0, 1.0);



  /* Draw pendulum cord */  

  glColor3f(1.0, 1.0, 1.0);

  glBegin(GL_LINES);

  glVertex2f(0.0, 0.0);

  xcenter = -cord_length * sin(current_angle);

  ycenter = -cord_length * cos(current_angle);

  glVertex2f(xcenter, ycenter);

  glEnd();



  /* Draw pendulum dish */

  glColor3f(1.0, 0.0, 0.0);

  glBegin(GL_POLYGON);

  while (theta <= pi2) {

    x = xcenter + radius * sin(theta);

    y = ycenter + radius * cos(theta);

    glVertex2f(x, y);

    theta += delta_theta;

  };

  glEnd();

  

  glutSwapBuffers();

};











int main(int argc, char **argv)  

{  

  /* GLUT Initializations */

  glutInit(&argc, argv);  

  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);  

  glutInitWindowPosition(5,5);  

  glutInitWindowSize(300,300);

  

  /* Open Window */

  glutCreateWindow("Pendulum");  

  

  /* Window initializations */

  winInit();

  

  /* Register callback functions */

  glutDisplayFunc(display);  

  glutIdleFunc(idle);

  

  /* Launch event processing */

  glutMainLoop();  

  

  return 0;  

}