#include #include #include double doublePI, PIdiv60, half_sqrt3;double r, phi = 0.0, theta = 0.0, cosphi, sinphi;double viewerposition_x = 1.0, viewerposition_y = 0.0, viewerposition_z = 0.0;double viewerup_x = 0.0, viewerup_y = 0.0, viewerup_z = 1.0;double scale_x = 1.0, scale_y = 1.0, scale_z = 1.0;double temp;double A = 0.0, B = 1.0, u, i, o, p;void keyfunc(unsigned char key, int x, int y){ switch (key){ case 'x': scale_x -= 0.05; break; case 'X': scale_x += 0.05; break; case 'y': scale_y -= 0.05; break; case 'Y': scale_y += 0.05; break; case 'z': scale_z -= 0.05; break; case 'Z': scale_z += 0.05; break; case '+': B += 0.05; u = (-0.5) * (A*(-0.5) + B ); i = (0.5) * (A*(-0.5) + B ); o = (-0.5) * (A*(0.5) + B ); p = (0.5) * (A*(0.5) + B ); break; case '-': B -= 0.05; u = (-0.5) * (A*(-0.5) + B ); i = (0.5) * (A*(-0.5) + B ); o = (-0.5) * (A*(0.5) + B ); p = (0.5) * (A*(0.5) + B ); break; case '*': A += 0.05; u = (-0.5) * (A*(-0.5) + B ); i = (0.5) * (A*(-0.5) + B ); o = (-0.5) * (A*(0.5) + B ); p = (0.5) * (A*(0.5) + B ); break; case '/': A -= 0.05; u = (-0.5) * (A*(-0.5) + B ); i = (0.5) * (A*(-0.5) + B ); o = (-0.5) * (A*(0.5) + B ); p = (0.5) * (A*(0.5) + B ); break; case 27: exit(1); break; } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(viewerposition_x, viewerposition_y, viewerposition_z, 0.0, 0.0, 0.0, viewerup_x, viewerup_y, viewerup_z); glScaled(scale_x, scale_y, scale_z);}void specialkeyfunc(int key, int x, int y){ switch(key){ case GLUT_KEY_LEFT: if((temp = phi - PIdiv60) < 0.0) phi = doublePI - PIdiv60; else phi = temp; break; case GLUT_KEY_RIGHT: if((temp = phi + PIdiv60) > doublePI) phi = PIdiv60; else phi = temp; break; case GLUT_KEY_UP: if((temp = theta + PIdiv60) > doublePI) theta = PIdiv60; else theta = temp; break; case GLUT_KEY_DOWN: if((temp = theta - PIdiv60) < 0.0) theta = doublePI - PIdiv60; else theta = temp; break; case GLUT_KEY_PAGE_DOWN: if((temp = r * 1.05) > 20.0) r = 20.0; else r = temp; glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-r, r, -r, r, -10.0, 1000.0); break; case GLUT_KEY_PAGE_UP: if((temp = r / 1.05) < half_sqrt3) r = half_sqrt3; else r = temp; glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-r, r, -r, r, -10.0, 1000.0); break; case GLUT_KEY_HOME: r = 2.0 * half_sqrt3; phi = theta = 0.0; glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-r, r, -r, r, -10.0, 1000.0); break; case GLUT_KEY_END: scale_x = scale_y = scale_z = 1.0; break; case GLUT_KEY_INSERT: A = 0.0; B = 1.0; u = (-0.5) * (A*(-0.5) + B ); i = (0.5) * (A*(-0.5) + B ); o = (-0.5) * (A*(0.5) + B ); p = (0.5) * (A*(0.5) + B ); break; } sinphi = sin(phi); cosphi = cos(phi); viewerposition_z = r * sin(theta); viewerup_z = cos(theta); viewerposition_x = r * cosphi * viewerup_z; viewerposition_y = r * sinphi * viewerup_z; viewerup_x = (-cosphi) * viewerposition_z; viewerup_y = (-sinphi) * viewerposition_z; glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(viewerposition_x, viewerposition_y, viewerposition_z, 0.0, 0.0, 0.0, viewerup_x, viewerup_y, viewerup_z); glScaled(scale_x, scale_y, scale_z);}void drawScene(void){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBegin(GL_LINES); glColor3d(1.0, 0.0, 0.0); glVertex3d(0.0, 0.0, 0.0); glVertex3d(B, 0.0, 0.0); glEnd(); glBegin(GL_LINES); glColor3d(0.0, 1.0, 0.0); glVertex3d(0.0, 0.0, 0.0); glVertex3d(0.0, B, 0.0); glEnd(); glBegin(GL_LINES); glColor3d(0.0, 0.0, 1.0); glVertex3d(0.0, 0.0, 0.0); glVertex3d(0.0, 0.0, 1.0); glEnd(); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glColor3d(1.0, 1.0, 1.0); glBegin(GL_POLYGON); glVertex3d(u, u, -0.5); glVertex3d(i, u, -0.5); glVertex3d(p, o, 0.5); glVertex3d(o, o, 0.5); glEnd(); glBegin(GL_POLYGON); glVertex3d(u, i, -0.5); glVertex3d(i, i, -0.5); glVertex3d(p, p, 0.5); glVertex3d(o, p, 0.5); glEnd(); glBegin(GL_POLYGON); glVertex3d(i, u, -0.5); glVertex3d(i, i, -0.5); glVertex3d(p, p, 0.5); glVertex3d(p, o, 0.5); glEnd(); glBegin(GL_POLYGON); glVertex3d(u, u, -0.5); glVertex3d(u, i, -0.5); glVertex3d(o, p, 0.5); glVertex3d(o, o, 0.5); glEnd(); glFlush(); glutSwapBuffers(); glutPostRedisplay();}void init(){ glEnable(GL_DEPTH_TEST); glClearColor(0.0, 0.0, 0.0, 0.0); glEnable(GL_LINE_SMOOTH); glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); u = (-0.5) * (A*(-0.5) + B ); i = (0.5) * (A*(-0.5) + B ); o = (-0.5) * (A*(0.5) + B ); p = (0.5) * (A*(0.5) + B ); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-r, r, -r, r, -10.0, 1000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(viewerposition_x, viewerposition_y, viewerposition_z, 0.0, 0.0, 0.0, viewerup_x, viewerup_y, viewerup_z); glScaled(scale_x, scale_y, scale_z);}void resizeWindow(int w, int h){ glViewport(0, 0, (GLsizei) w, (GLsizei) h);}int main(int argc, char** argv){ doublePI = 2.0 * M_PI; PIdiv60 = M_PI / 60.0; half_sqrt3 = sqrt(3.0) / 2.0; r = 2.0 * half_sqrt3; glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowPosition(20, 60); glutInitWindowSize(640, 640); glutCreateWindow("Branko Kockica"); init(); glutKeyboardFunc(keyfunc); glutSpecialFunc(specialkeyfunc); glutReshapeFunc(resizeWindow); glutDisplayFunc(drawScene); glutMainLoop(); return(0);}