http://icomn.net/~dak/images/sierpinskigasket.png

void myinit()
{
  glClearColor(1.0, 1.0, 1.0, 1.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, 500.0, 0.0, 500.0);
  glMatrixMode(GL_MODELVIEW);
}

void display()
{
  /* define a point data type */
  typedef GLfloat point2[2];

  point2 vertices[3]={{0.0, 0.0},{250.0, 500.0}, {500.0, 0.0}}; /* A triangle
  */

  int i, j, k;
  int rand();                   /* standard random number generator */
  point2 p ={75.0, 50.0};       /* An arbitray initial point inside triangle
  */

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

  /* compute and plot 5000 new points */
  for( k=0; k<5000; k++){
    j=rand()%3;
    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 */
}

int main(int argc, char** argv)
{
  /* Standard GLUT initialization */
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); /* default, not needed */
  glutInitWindowSize(500,500);  /* 500 x 500 pixel window */
  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 */
}

[OpenGL]