/* * FreeGLUT Shapes Demo * * Written by Nigel Stewart November 2003 * * This program is test harness for the sphere, cone * and torus shapes in FreeGLUT. * * Spinning wireframe and smooth shaded shapes are * displayed until the ESC or q key is pressed. The * number of geometry stacks and slices can be adjusted * using the + and - keys. */ #include #include #include int glebia = 0; int max_g = 7 ; int mode = 1 ; float x1=-4.0 , yy1=-3.0 , z1=-5.0, x2=4.0 , yy2=-3.0 , z2=-5.0, x3=0.0 , yy3=3.0, z3=-5, x4=0 , yy4=0 , z4=-5 , angle3=0.005; float kx1=-3.5f , ky1=3.5f , kz1=-5.0 , kx2=-3.5f , ky2=-3.5f , kz2=-5.0 , kx3=3.5f , ky3=-3.5f , kz3=-5.0 , kx4=3.5f , ky4=3.5f , kz4=-5.0 ; void rysuj(float x1, float yy1, float x2, float yy2, float x3, float y3) ; void krysuj(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) ; void obroc(float &a, float a0, float &b, float b0, float kat) { a = a0 + (a - a0) * cos(kat) + (b - b0) * sin(kat); b = b0 - (a - a0) * sin(kat) + (b - b0) * cos(kat); // x2 = x + (x2 - x) * cos(angle3) + (yy2 - y) * sin(angle3); // yy2 = y - (x2 - x) * sin(angle3) + (yy2 - y) * cos(angle3); return ; } void wywolaj(float x1, float yy1, float x2, float yy2, float x3, float y3, int limit) { float a_x, a_y, b_x, b_y, c_x, x_y, c_y ; a_x=(float) (x1+x2)/2.0 ; a_y=(float) (yy1+yy2)/2.0 ; b_x=(float) (x1+x3)/2.0 ; b_y=(float) (yy1+y3)/2.0 ; c_x=(float) (x2+x3)/2.0 ; c_y=(float) (yy2+y3)/2.0 ; if(limit==0) { rysuj(x1,yy1,x2,yy2,x3,y3); } else { wywolaj(x1,yy1,a_x,a_y,b_x,b_y,limit-1) ; wywolaj(x2,yy2,a_x,a_y,c_x,c_y,limit-1) ; wywolaj(x3,y3,c_x,c_y,b_x,b_y,limit-1) ; }; return ; } void kwywolaj(float x1, float y1, float x2, float y2, float x3, float y3,float x4, float y4, int limit) { float a_x, a_y, b_x, b_y;///, c_x, c_y ; a_x= (float) ((float) std::abs ( (float)((float)x4-(float)x1)))/3.0f ; a_y=(float) std::abs(y4-y1)/3.0 ; b_x=(float) std::abs(x2-x1)/3.0 ; b_y=std::abs(y2-y1)/3.0f ; if(limit==0) { krysuj(x1,y1,x2,y2,x3,y3,x4,y4); } else { for(int i=0;i<3;i++) for(int j=0;j<3;j++) if((i!=1)||(j!=1)) { kwywolaj(x1-(a_x*i)-b_x*j,a_y*(j+1), b_x*(i+1),b_y*(j+1), b_x*(i+1)-b_x*j, b_y*(j+1)-a_y*i, x1*i+a_x*(i+1),y1-a_y*(j+1), limit-1 ) ; }; }; return ; } void rysuj(float x1, float yy1, float x2, float yy2, float x3, float y3) { float z=-5; glBegin(GL_TRIANGLES); glColor3ub(49,128,248); glVertex3f( x1, yy1, z); // glColor3ub(0, 255, 0); glVertex3f( x2, yy2, z); /// glColor3ub(0, 0, 255); glVertex3f( x3, y3, z); glEnd(); } void krysuj(float x1, float yy1, float x2, float yy2, float x3, float yy3, float x4, float yy4) { float z=-5; glBegin(GL_QUADS); glColor3ub(49,128,248); glVertex3f( x1, yy1, z); glVertex3f( x2, yy2, z); glVertex3f( x3, yy3, z); glVertex3f( x4, yy4, z); glEnd(); } /* GLUT callback Handlers */ static void resize(int width, int height) { const float ar = (float) width / (float) height; glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(-ar, ar, -1.0, 1.0, 1, 60.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity() ; } static void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // glColor3d(0,0,0); if(mode==1) wywolaj(x1,yy1,x2,yy2,x3,yy3,glebia); else if(mode==2) kwywolaj(kx1,ky1,kx2,ky2,kx3,ky3,kx4,ky4,glebia) ; // slep(1000); // i++; /* Obrót wzgl. osi X */ /* yy1 = y + (yy1 - y) * cos(angle1) + (z1 - z) * sin(angle1); z1 = z - (yy1 - y) * sin(angle1) + (z1 - z) * cos(angle1); yy2 = y + (yy2 - y) * cos(angle1) + (z2 - z) * sin(angle1); z2 = z - (yy2 - y) * sin(angle1) + (z2 - z) * cos(angle1); y3 = y + (y3 - y) * cos(angle1) + (z3 - z) * sin(angle1); z3 = z - (y3 - y) * sin(angle1) + (z3 - z) * cos(angle1); /* Obrót wzgl. osi Y x1 = x + (x1 - x) * cos(angle3) + (z1 - z) * sin(angle2); z1 = z - (x1 - x) * sin(angle3) + (z1 - z) * cos(angle2); x2 = x + (x2 - x) * cos(angle3) + (z2 - z) * sin(angle2); z2 = z - (x2 - x) * sin(angle3) + (z2 - z) * cos(angle2); x3 = x + (x3 - x) * cos(angle3) + (z3 - z) * sin(angle2); z3 = z - (x3 - x) * sin(angle3) + (z3 - z) * cos(angle2); */ /* Obrót wzgl. osi Z */ //if(key[KEY_A]) {angle3=0.05;nico=1;} //else if(key[KEY_S]) {angle3+=0.005;nico=1;} //else nico=0; /* x2 = x + (x2 - x) * cos(angle3) + (yy2 - y) * sin(angle3); yy2 = y - (x2 - x) * sin(angle3) + (yy2 - y) * cos(angle3); x3 = x + (x3 - x) * cos(angle3) + (yy3 - y) * sin(angle3); yy3 = y - (x3 - x) * sin(angle3) + (yy3 - y) * cos(angle3); */ glutSwapBuffers(); } static void key(unsigned char key, int x, int y) { switch (key) { case 27 : case 'p': exit(0); break; case '+': if(glebia0) { glebia--; } break; case 'a': if(mode==1) { obroc(x1, x4, yy1, yy4, angle3); obroc(x2, x4, yy2, yy4, angle3); obroc(x3, x4, yy3, yy4, angle3); } else if(mode==2) { obroc(kx1, 0, ky1, 0, angle3); obroc(kx2, 0, ky2, 0, angle3); obroc(kx3, 0, ky3, 0, angle3); obroc(kx4, 0, ky4, 0, angle3); } break ; case 'd': obroc(x1, x4, yy1, yy4, 2*M_PI-angle3); obroc(x2, x4, yy2, yy4, 2*M_PI-angle3); obroc(x3, x4, yy3, yy4, 2*M_PI-angle3); break ; case 'w': obroc(z1, z4, yy1, yy4, 2*M_PI-angle3); obroc(z2, z4, yy2, yy4, 2*M_PI-angle3); obroc(z3, z4, yy3, yy4, 2*M_PI-angle3); break ; case 's': obroc(z1, z4, yy1, yy4, angle3); obroc(z2, z4, yy2, yy4, angle3); obroc(z3, z4, yy3, yy4, angle3); break ; case 'q': obroc(z1, z4, x1, x4, angle3); obroc(z2, z4, x2, x4, angle3); obroc(z3, z4, x3, x4, angle3); break ; case 'e': obroc(z1, z4, x1, x4, 2*M_PI-angle3); obroc(z2, z4, x2, x4, 2*M_PI-angle3); obroc(z3, z4, x3, x4, 2*M_PI-angle3); break ; case '1': mode=1; max_g=7; glebia=0; break; case '2': mode=2; max_g=6; glebia=0; break ; } glutPostRedisplay(); } static void idle(void) { glutPostRedisplay(); } /* const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f }; const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f }; const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f }; const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f }; const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f }; const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; const GLfloat high_shininess[] = { 100.0f }; */ /* Program entry point */ int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitWindowSize(800,600); glutInitWindowPosition(10,10); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("Obroty figurowe :P"); glutReshapeFunc(resize); glutDisplayFunc(display); glutKeyboardFunc(key); glutIdleFunc(idle); glClearColor(0,0,0,1); // glEnable(GL_CULL_FACE); // glCullFace(GL_BACK); /* glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); glEnable(GL_LIGHT0); glEnable(GL_NORMALIZE); glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHTING); */ glutMainLoop(); return EXIT_SUCCESS; }