#include #include #include #include #include #include #include #ifndef M_PI #define M_PI 3.14159 #endif static void cylindre(float r,float h,int n){ float *cs =(float *) calloc(n,sizeof(float)); float *sn =(float *) calloc(n,sizeof(float)); int i; for( i = 0 ; i < n ; i++ ){ float a = (2*M_PI*i)/n; sn[i] = sin(a); cs[i] = cos(a); } glPushMatrix(); glBegin(GL_QUAD_STRIP); for ( int j = 0 ; j < n ; j++ ) { float hi = h/2-(j*h/n); float hf = h/2-((j+1)*h/n); for( i = 0 ; i <= n ; i++ ){ float x = r*cs[i%n]; float z = -r*sn[i%n]; glNormal3f(cs[i%n],0.0F,-sn[i%n]); glVertex3f(x,hi,z); glVertex3f(x,hf,z); } } glEnd(); glBegin(GL_POLYGON); glNormal3f(0.0F,1.0F,0.0F); for ( i = 0 ; i < n ; i++ ){ float si = -sn[i]; float ci = cs[i]; glVertex3f(r*ci,h/2,r*si); } glEnd(); glBegin(GL_POLYGON); glNormal3f(0.0F,-1.0F,0.0F); for ( i = 0 ; i < n ; i++ ){ float si = sn[i]; float ci = cs[i]; glVertex3f(r*ci,-h/2,r*si); } glEnd(); free(cs); free(sn); glPopMatrix(); } void cone(float r,float h,int n){ float *cs =(float *) calloc(n,sizeof(float)); float *sn =(float *) calloc(n,sizeof(float)); int i; for ( i = 0 ; i < n ; i++ ) { float a = (2*M_PI*i)/n; sn[i] = sin(a); cs[i] = cos(a); } glPushMatrix(); float f = 1.0F/pow(r*r+h*h,0.5); for ( int j = 0 ; j < n ; j++ ) { glBegin(GL_QUAD_STRIP); for ( i = 0 ; i <= n ; i++ ) { float x = r*cs[i%n]; float z = -r*sn[i%n]; glNormal3f(cs[i%n]*f*h,r*f,-sn[i%n]*f*h); glVertex3f(j*x/n,h/2-j*h/n,j*z/n); glVertex3f((j+1)*x/n,h/2-(j+1)*h/n,(j+1)*z/n); } glEnd(); } glBegin(GL_POLYGON); glNormal3f(0.0F,-1.0F,0.0F); for ( i = 0 ; i < n ; i++ ) { float si = sn[i]; float ci = cs[i]; glVertex3f(r*ci,-h/2,r*si); } glEnd(); free(cs); free(sn); glPopMatrix(); } static void fleche(int fac) { glPushMatrix(); glTranslatef(0.0F,1.5F,0.0); cylindre(0.5F,3.0F,fac); glTranslatef(0.0F,3.0F,0.0); cone(1.0F,3.0F,fac); glPopMatrix(); } void croix(int fac) { glPushMatrix(); fleche(fac); glRotatef(90.0F,0.0F,0.0F,1.0F); fleche(fac); glRotatef(90.0F,0.0F,0.0F,1.0F); fleche(fac); glRotatef(90.0F,0.0F,0.0F,1.0F); fleche(fac); glPopMatrix(); }