/* Hilbert */ #include #include int x=0,y=0,linea=4,orden; char tipo; void hilbert(char tipo,int orden) { if (orden==1) { if (tipo=='A') { glBegin(GL_LINE_STRIP); glVertex2f(x,y); y=y+linea; glVertex2f(x,y); x=x+linea; glVertex2f(x,y); y=y-linea; glVertex2f(x,y); glEnd(); } else if (tipo=='B') { glBegin(GL_LINE_STRIP); glVertex2f(x,y); x=x+linea; glVertex2f(x,y); y=y+linea; glVertex2f(x,y); x=x-linea; glVertex2f(x,y); glEnd(); } else if (tipo=='C') { glBegin(GL_LINE_STRIP); glVertex2f(x,y); x=x-linea; glVertex2f(x,y); y=y-linea; glVertex2f(x,y); x=x+linea; glVertex2f(x,y); glEnd(); } else if (tipo == 'D') { glBegin(GL_LINE_STRIP); glVertex2f(x,y); y=y-linea; glVertex2f(x,y); x=x-linea; glVertex2f(x,y); y=y+linea; glVertex2f(x,y); glEnd(); } else printf("Type not understood/n"); } else { if (tipo=='A') { hilbert('B',orden-1); glBegin(GL_LINES); glVertex2f(x,y); y=y+linea; glVertex2f(x,y); glEnd(); hilbert('A',orden-1); glBegin(GL_LINES); glVertex2f(x,y); x=x+linea; glVertex2f(x,y); glEnd(); hilbert('A',orden-1); glBegin(GL_LINES); glVertex2f(x,y); y=y-linea; glVertex2f(x,y); glEnd(); hilbert('C',orden-1); } else if (tipo=='B') { hilbert('A',orden-1); glBegin(GL_LINES); glVertex2f(x,y); x=x+linea; glVertex2f(x,y); glEnd(); hilbert('B',orden-1); glBegin(GL_LINES); glVertex2f(x,y); y=y+linea; glVertex2f(x,y); glEnd(); hilbert('B',orden-1); glBegin(GL_LINES); glVertex2f(x,y); x=x-linea; glVertex2f(x,y); glEnd(); hilbert('D',orden-1); } else if (tipo=='C') { hilbert('D',orden-1); glBegin(GL_LINES); glVertex2f(x,y); x=x-linea; glVertex2f(x,y); glEnd(); hilbert('C',orden-1); glBegin(GL_LINES); glVertex2f(x,y); y=y-linea; glVertex2f(x,y); glEnd(); hilbert('C',orden-1); glBegin(GL_LINES); glVertex2f(x,y); x=x+linea; glVertex2f(x,y); glEnd(); hilbert('A',orden-1); } else if (tipo == 'D') { hilbert('C',orden-1); glBegin(GL_LINES); glVertex2f(x,y); y=y-linea; glVertex2f(x,y); glEnd(); hilbert('D',orden-1); glBegin(GL_LINES); glVertex2f(x,y); x=x-linea; glVertex2f(x,y); glEnd(); hilbert('D',orden-1); glBegin(GL_LINES); glVertex2f(x,y); y=y+linea; glVertex2f(x,y); glEnd(); hilbert('B',orden-1); } else printf("Type not understood/n"); } } void display(void) { glClear(GL_COLOR_BUFFER_BIT); /* clear the window */ hilbert(tipo,orden); glFlush(); /* clear buffers */ } void main(int argc, char** argv) { int i, lado = 1; float negsize, possize; if (argc != 3) { printf("Type and Order required/n"); exit(0); } tipo = *argv[1]; orden = atoi(argv[2]); /* Standard GLUT initialization */ glutInit(&argc,argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); /* default, not needed */ glutInitWindowSize(400,400); /* 400 x 400 pixel window */ glutInitWindowPosition(120,40); /* place window top left on display */ glutCreateWindow("Hilbert"); /* window title */ glutDisplayFunc(display); /* display callback invoked when window opened */ /* attributes */ glClearColor(0.0, 0.0, 0.0, 0.0); /* Black background */ glColor3f(1.0, 0.0, 0.0); /* draw in red */ /* set up viewing, 250 x 250 window with origin lower left */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); for (i = 1; i < orden; i++) lado = 2*lado + 1; if (tipo == 'A' || tipo == 'B') { possize = lado*linea; negsize = 0.0; } else { possize = 0.0; negsize = -lado*linea; } gluOrtho2D(negsize,possize,negsize,possize); glMatrixMode(GL_MODELVIEW); glutMainLoop(); /* enter event loop */ }