#include "/usr/local/include/GL/gl.h"
#include "/usr/local/include/GL/glut.h"

#define WINDOW_WIDTH 600
#define WINDOW_HEIGHT 500
#define MODEL_WIDTH 1.0
#define MODEL_HEIGHT 1.0
#define NUM_POINTS 10000

void myinit(void)
{
 
/* attributes */

 	  glClearColor(1.0, 1.0, 1.0, 0.0); /* white background */
	   glColor3f(1.0, 0.0, 0.0); /* draw in red */

/* set up viewing */
/* 500 x 500 window with origin lower left */

	   glMatrixMode(GL_PROJECTION);
	   glLoadIdentity();
	   gluOrtho2D(0.0, MODEL_WIDTH, 0.0, MODEL_HEIGHT);
	   glMatrixMode(GL_MODELVIEW);
}

void display( void )
{

/* define a point data type */

    typedef GLfloat point2[2];     

    point2 vertices[3]={{0.0,0.0},
                        {MODEL_WIDTH/2,MODEL_HEIGHT},
                        {MODEL_WIDTH,0.0}}; /* A triangle */

    int i, j, k;
    long random();       /* standard random number generator */
    point2 p ={0.1,0.15};  /* An srbitrary initial point */

    glClear(GL_COLOR_BUFFER_BIT);  /*clear the window */


/* computes and plots NUM_POINTS new points */

    for( k=0; k<NUM_POINTS; k++)
    {
	      j=random()%3; /* pick a vertex at random */


     /* Compute point halfway between vertex and old point */

	      p[0] = (p[0]+vertices[j][0])/2.0; 
	      p[1] = (p[1]+vertices[j][1])/2.0;
	
     /* plot new point */

	       glBegin(GL_POINTS);
		         glVertex2fv(p); 
	       glEnd();
	
              glFlush(); /* clear buffers */
     }
 }

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

/* Standard GLUT initialization */

	    glutInit(&argc,argv);
	    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); /* default, not needed */
	    glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT);
	    glutInitWindowPosition(0,0); /* place window top left on display */
	    glutCreateWindow("Sierpinski Gasket"); /* window title */
	    glutDisplayFunc(display); /* display callback invoked when window opened */

     myinit(); /* set attributes */

	    glutMainLoop(); /* enter event loop */
}

