/* $Id: gears.c,v 3.0 1998/02/14 18:42:29 brianp Exp $ */ /* * 3-D gear wheels. This program is in the public domain. * * Brian Paul */ #include "windows.h" #include #include #include #include #include #ifndef M_PI #define M_PI 3.14159265F #endif static float cosF(double v) { return((float) cos(v)) ; } static float sinF(double v) { return((float) sin(v)) ; } static void gear(GLfloat inner_radius,GLfloat outer_radius,GLfloat width,GLint teeth,GLfloat tooth_depth ) { GLint i; GLfloat r0,r1,r2; GLfloat angle,da; GLfloat u,v,len; r0 = inner_radius; r1 = outer_radius-tooth_depth/2.0F; r2 = outer_radius+tooth_depth/2.0F; da = 2.0F*M_PI/teeth/4.0F; glShadeModel(GL_FLAT); glNormal3f(0.0,0.0,1.0); glBegin(GL_QUAD_STRIP); for ( i = 0 ; i <= teeth ; i++ ) { angle = i * 2.0F*M_PI / teeth; glVertex3f(r0*cosF(angle),r0*sinF(angle),width*0.5F); glVertex3f(r1*cosF(angle),r1*sinF(angle),width*0.5F); glVertex3f(r0*cosF(angle),r0*sinF(angle),width*0.5F); glVertex3f(r1*cosF(angle+3*da),r1*sinF(angle+3*da),width*0.5F); } glEnd(); glBegin(GL_QUADS); da = 2.0F*M_PI/teeth/4.0F; for ( i = 0 ; i < teeth ; i++ ) { angle = i * 2.0F*M_PI / teeth; glVertex3f(r1*cosF(angle),r1*sinF(angle),width*0.5F); glVertex3f(r2*cosF(angle+da),r2*sinF(angle+da),width*0.5F); glVertex3f(r2*cosF(angle+2*da),r2*sinF(angle+2*da),width*0.5F); glVertex3f(r1*cosF(angle+3*da),r1*sinF(angle+3*da),width*0.5F); } glEnd(); glNormal3f(0.0,0.0,-1.0); glBegin(GL_QUAD_STRIP); for ( i = 0 ; i <= teeth ; i++ ) { angle = i * 2.0F*M_PI / teeth; glVertex3f(r1*cosF(angle),r1*sinF(angle),-width*0.5F); glVertex3f(r0*cosF(angle),r0*sinF(angle),-width*0.5F); glVertex3f(r1*cosF(angle+3*da),r1*sinF(angle+3*da),-width*0.5F); glVertex3f(r0*cosF(angle),r0*sinF(angle),-width*0.5F); } glEnd(); glBegin(GL_QUADS); da = 2.0F*M_PI/teeth/4.0F; for (i=0;i