/* prac2c.c */ /* This program constructs a hexagonal shape. The space bar toggles between flat and smooth shading. */ #ifdef __APPLE__ #include #else #include #endif #include #include #include #define KEY_ESC 27 /* glut doesn't define this one */ void printHelp( void ) { fprintf(stdout, "prac2c\n\n" "SPACE key - alternate between flat and smooth shading\n" "Escape key - exit the program\n\n"); } GLvoid keyboard( GLubyte key, GLint x, GLint y) { switch (key) { case KEY_ESC: /* exit when escape key is pressed */ exit(0); break; case ' ': { static GLboolean flat = GL_FALSE; /* toggle between flat and smooth shading */ flat = !flat; flat ? glShadeModel(GL_FLAT) : glShadeModel(GL_SMOOTH); } break; } glutPostRedisplay(); } GLvoid specialkeys( GLint key, GLint x, GLint y) { switch (key) { case GLUT_KEY_F1: /* print Help information */ printHelp ( ); break; } } GLvoid checkError( const char* const label ) { GLenum error; error = glGetError(); while ( GL_NO_ERROR != error ) { fprintf( stderr,"%s: %s\n", label, gluErrorString(error) ); error = glGetError(); } } void drawHexagon( void ) { glBegin(GL_POLYGON); glColor3f(0.0, 0.0, 1.0); glVertex2f(1.0, 0.0); glVertex2f(0.5, 1.0); glVertex2f(-0.5, 1.0); glVertex2f(-1.0, 0.0); glVertex2f(-0.5, -1.0); glVertex2f(0.5, -1.0); glEnd(); } void drawTriangle( void ) { float sqrt5; float sqrt15; sqrt5 = sqrt(5.0); sqrt15 = sqrt(15.0); glBegin(GL_TRIANGLES); glVertex2f(1.0, 0.0); glVertex2f(1.0+sqrt5/4.0, sqrt15/4.0); glColor3f(1.0, 0.0, 0.0); glVertex2f(0.5, 1.0); glVertex2f(0.5, 1.0); glVertex2f(0.0, 1.0+sqrt15/4.0); glColor3f(0.0, 1.0, 0.0); glVertex2f(-0.5, 1.0); glVertex2f(-0.5, 1.0); glVertex2f(-1.0-sqrt5/4.0, sqrt15/4.0); glColor3f(1.0, 1.0, 0.0); glVertex2f(-1.0, 0.0); glVertex2f(-1.0, 0.0); glVertex2f(-1.0-sqrt5/4.0, -sqrt15/4.0); glColor3f(0.0, 1.0, 1.0); glVertex2f(-0.5, -1.0); glVertex2f(-0.5, -1.0); glVertex2f(0.0, -1.0-sqrt15/4.0); glColor3f(1.0, 0.0, 1.0); glVertex2f(0.5, -1.0); glVertex2f(0.5, -1.0); glVertex2f(1.0+sqrt5/4.0, -sqrt15/4.0); glColor3f(0.0, 0.0, 0.0); glVertex2f(1.0, 0.0); glEnd(); } GLvoid display( GLvoid ) { /* Do all your OpenGL rendering here */ glClear( GL_COLOR_BUFFER_BIT ); drawHexagon(); drawTriangle(); checkError( "display" ); glFlush(); } void init( void ) { glClearColor( 1.0, 1.0, 1.0, 1.0); glPointSize(3.0); /* set large point size */ glLineWidth(3.0); /* Set a viewing volume for the data we wish to display */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-3.0, 3.0, -3.0, 3.0,-3.0, 3.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } int main( int argc, char *argv[] ) { glutInit( &argc, argv ); glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB ); glutCreateWindow( argv[0] ); /* use the default window */ printHelp(); glutDisplayFunc( display ); glutKeyboardFunc( keyboard ); glutSpecialFunc( specialkeys ); init(); glutMainLoop(); return 0; }