#include <math.h>
#include <GL/glut.h>
#define WINDOW_WIDTH 400
#define WINDOW_HEIGHT 400
#define PI 3.1415927
//int diagramNo = 1;
//float zoom = 0;
int diagramNo;
float zoom;
float inc;
float alpha;
int rotX,rotY;
float yRotSpeed;
void calCoordinates(float fi, float teta, float *x, float *y, float *z);
void Reshape(int width, int height);
void init()
{
diagramNo = 1;
inc = 0;
alpha = 0;
zoom = 0;
rotX = 0;
rotY = 0;
yRotSpeed = 0.5;
glShadeModel (GL_FLAT);
glClearColor((float) 0.3, (float) 0.0, (float) 0.5, (float) 0.0);
glEnable(GL_DEPTH_TEST);
}
void calCoordinates(float fi, float teta, float x, float y, float z)
{
if(diagramNo == 2)
{
x = 0.5(cos(fi) + 0.5cos(2fi));
y = 0.5cos(teta)(2 + sin(fi) - 0.5sin(2fi));
z = 0.5sin(teta)(2 + sin(fi) - 0.5sin(2*fi));
}
else
{
x = ( 1 + 0.25cos(teta) ) * cos(fi);
y = ( 1 + 0.25cos(teta) ) * sin(fi);
*z = 0.25 * sin(teta);
}
}
void draw()
{
float delta = PI/12.0;
float x, y, z;
float fi, teta;
float fi1 = 0.0;
float teta1 = 0.0;
float fi2 = 2PI;
float teta2 = 2PI;
// x axis
glColor3f((float) 1.0, (float) 0.0, (float) 0.0);
glBegin(GL_LINE_STRIP);
glVertex3f(0, 0, 0);
glVertex3f(2, 0, 0);
glEnd();
// y axis
glColor3f((float) 0.0, (float) 0.0, (float) 1.0);
glBegin(GL_LINE_STRIP);
glVertex3f(0, 0, 0);
glVertex3f(0, 2, 0);
glEnd();
// z axis
glColor3f((float) 0.0, (float) 1.0, (float) 0.0);
glBegin(GL_LINE_STRIP);
glVertex3f(0, 0, 0);
glVertex3f(0, 0, 2);
glEnd();
glColor3f((float) 0.0, (float) 1.0, (float) 0.0);
for(fi=fi1; fi<=fi2; fi+=delta)
{
glBegin(GL_LINE_STRIP);
for(teta=teta1; teta<=teta2; teta+=delta)
{
calCoordinates(fi, teta, &x, &y, &z);
glVertex3f(x, y, z);
}
glEnd();
}
for(teta=teta1; teta<=teta2; teta+=delta)
{
glBegin(GL_LINE_STRIP);
for(fi=fi1;fi<=fi2;fi+=delta)
{
calCoordinates(fi,teta,&x,&y,&z);
glVertex3f(x,y,z);
}
glEnd();
}
}
static void SpecialKey(int key, int x, int y)
{
switch (key)
{
case GLUT_KEY_LEFT:
rotY -= 3.0;
break;
case GLUT_KEY_RIGHT:
rotY += 3.0;
break;
case GLUT_KEY_UP:
rotX += 3.0;
break;
case GLUT_KEY_DOWN:
rotX -= 3.0;
break;
}
}
void input(unsigned char key, int x, int y)
{
switch (key)
{
case '1':
diagramNo = 1;
break;
case '2':
diagramNo = 2;
break;
case 'Z':
zoom -= 0.1;
glutPostRedisplay();
break;
case 'z':
zoom += 0.1;
glutPostRedisplay();
break;
case 'R':
if(inc == yRotSpeed)
{
inc = 0;
}
else
{
inc = yRotSpeed;
}
// glutPostRedisplay();
break;
case 'r':
if(inc == yRotSpeed)
{
inc = 0;
}
else
{
inc = yRotSpeed;
}
// glutPostRedisplay();
break;
case 'A':
// glutPostRedisplay();
break;
case 'a':
// glutPostRedisplay();
break;
case 'F':
// glutPostRedisplay();
break;
case 'f':
// glutPostRedisplay();
break;
case 'S':
// glutPostRedisplay();
break;
case 's':
// glutPostRedisplay();
break;
case 'T':
// glutPostRedisplay();
break;
case 't':
// glutPostRedisplay();
break;
case 'C':
// glutPostRedisplay();
break;
case 'c':
// glutPostRedisplay();
break;
case 'p':
// glutPostRedisplay();
break;
case 'P':
// glutPostRedisplay();
break;
case 'W':
// glutPostRedisplay();
break;
case 'w':
// glutPostRedisplay();
break;
}
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(rotY, 0.0, 1.0, 0.0);
glRotatef(rotX, 1.0, 0.0, 0.0);
Reshape(zoom,zoom);
alpha = alpha + (float) inc;
if(alpha > (float) 360.0)
{
alpha -= (float) 360.0;
}
glRotatef(alpha, (float) 0.0, (float) 1.0, (float) 0.0);
draw();
glPopMatrix();
glFlush();
glutSwapBuffers();
}
void idle(void)
{
glutPostRedisplay();
}
void Reshape(int width, int height)
{
glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-width,height,-width,height,-10,10);
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT);
glutInitWindowPosition(100, 100);
glutCreateWindow("My Program");
init();
glutDisplayFunc (display);
glutKeyboardFunc (input);
glutSpecialFunc(SpecialKey);
glutReshapeFunc(Reshape);
glutIdleFunc (idle);
glutMainLoop();
return 0;
}
i wonder what is wrong with the direction of rotation, it changes at run time…