Визуализация поверхности второго порядка - параболоид в 3х-мерной системе координат
#include <string.h>
#include <glut.h>
#define drawOneLine(x1,y1,z1,x2,y2,z2) glBegin(GL_LINES); \
glVertex3f(x1,y1,z1); glVertex3f (x2,y2,z2); glEnd();
int WindW, WindH;
int alpha;
int max = 2;
int min = -max;
void Reshape(int width, int height) // Reshape function
{
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//3х мерная проекция xmin xmax ymin ymax zmin zmax
glOrtho(min,max, min,max, min,max);
glMatrixMode(GL_MODELVIEW);
WindW = width;
WindH = height;
}
void drawString (char *s)
{
unsigned int i;
for (i = 0; i < strlen (s); i++)
glutBitmapCharacter (GLUT_BITMAP_HELVETICA_12, s[i]);
}
void Coordinate()
{
glColor3f (1.0F, 1.0F, 1.0F);
glRasterPos3f(1.1f, 0.0f, 0.0f);
drawString ("+X");
glRasterPos3f(-1.1f, 0.0f, 0.0f);
drawString ("-X");
glRasterPos3f(0.0f, 1.1f, 0.0f);
drawString ("+Y");
glRasterPos3f(0.0f, -1.1f, 0.0f);
drawString ("-Y");
glRasterPos3f(0.0f, 0.0f, 1.1f);
drawString ("+Z");
glRasterPos3f(0.0f, 0.0f, -1.1f);
drawString ("-Z");
glBegin(GL_LINES);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 1.0f);
glEnd();
glEnable (GL_LINE_STIPPLE);
glLineStipple (1.5, 0x00FF);
glColor3f(1.0f, 0.0f, 0.0f);
drawOneLine (0.0, 0.0, 0.0, -1.0, 0.0, 0.0);
glColor3f(0.0f, 1.0f, 0.0f);
drawOneLine (0.0, 0.0, 0.0, 0.0, -1.0, 0.0);
glColor3f(0.0f, 0.0f, 1.0f);
drawOneLine (0.0, 0.0, 0.0, 0.0, 0.0, -1.0);
glLineWidth (1.0);
glDisable (GL_LINE_STIPPLE);
}
void Paraboloid()
{
glColor3f(0.7f, 0.3f, 0.8f);
float z;
for(float x=-1;x<=1;x+=0.05)
{
glBegin(GL_LINE_STRIP);
for(float y=-1;y<=1;y+=0.001)
{
//z=(1.5-x*x)+(0.5-y*y);
z=x*x+y*y;
if (z<1)
glVertex3f(x, y, z);
}
glEnd();
}
for(float y=-1;y<=1;y+=0.05)
{
glBegin(GL_LINE_STRIP);
for(float x=-1;x<=1;x+=0.001)
{
//z=(1.5-x*x)+(0.5-y*y);
z=x*x+y*y;
if (z<1)
glVertex3f(x, y, z);
}
glEnd();
}
}
void Draw(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glLineWidth(1.0);
glPushMatrix();
glRotatef(alpha, 1.0f, 0.0f, 1.0f);
alpha += 1;
if (alpha > 359) alpha = 0;
Coordinate();
Paraboloid();
glPopMatrix();
glFlush();
glutSwapBuffers();
}
//Таймер
void timf(int value) // Timer function
{
glutPostRedisplay();
glutTimerFunc(20, timf, 0); // задержка 20 милисекунд
}
int main(int argc, char *argv[])
{
WindW = 400;
WindH = 300;
alpha = 0;
glutInit(&argc, argv);
glutInitWindowSize(WindW, WindH);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
(void)glutCreateWindow("3d function");
glutReshapeFunc(Reshape); // при изменении размера окна вызываем reshape
glutDisplayFunc(Draw);
//Активация таймера для движения
glutTimerFunc(40, timf, 0); // 40 мс соответствует ~25 кадров/с
glClearColor(1, 0, 0, 0);
glutMainLoop();
return 0;
}
Для самостоятельной работы:
1. Изобразите в пространстве эллипсоид
xx/aa+yy/bb+zz/cc=1
2. Изобразите в пространстве гиперболический параболоид
xx/aa-yy/bb=2pz