Создание компьютерной графики при помощи OpenGL
1. Напишите программу вывода графика функции y= tg (x)+5*cos (x), с помощью точек, а затем с помощью линий. 1.1 С помощью точек Решение: #include <windows.h> #include <gl\gl.h> #include <gl\glu.h> #include <gl\glaux.h> #include <math.h> GLint windW, windH; void CALLBACK Reshape(int width, int height) { glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-15,15,-15,15); glMatrixMode(GL_MODELVIEW); } void CALLBACK Draw(void) { glClearColor(1.0,1.0,1.0,1); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_LINES); glColor3ub(190,190,190); for (int i=-4; i<=4; i++) { glVertex2f(float(i), -6);//явное преобразование типа glVertex2f(float(i), 15); } for (i=-6; i<=15; i++) { glVertex2f(-4, float(i)); glVertex2f(4, float(i)); } glEnd(); glColor3ub(0,0,0); glBegin(GL_LINES); glVertex2f (-5, 0); glVertex2f(5, 0); glVertex2f(0,16); glVertex2f(0,-7); glEnd(); glPointSize(2); glBegin(GL_POINTS); glColor3ub(0,0,255); int n; double a,b,dx,x,y; a=-1.415; b=1.5; n=20; dx=(b-a)/(n-1); x=a; y=0; for (i=1; i<=n; i++) { y=float(tan(x)+5*cos(x)); glVertex2d (x, y); x=x+dx; } glEnd(); glFinish(); auxSwapBuffers(); } void main(int argc, char **argv) AUX_DOUBLE); auxInitWindow("v11_01_1"); glTranslated(0,-4,0); auxReshapeFunc(Reshape); auxMainLoop(Draw); Результат: 2.2 с помощью линий Решение: #include <windows.h> #include <gl\gl.h> #include <gl\glu.h> #include <gl\glaux.h> #include <math.h> GLint windW, windH; void CALLBACK Reshape(int width, int height) { glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-15,15,-15,15); glMatrixMode(GL_MODELVIEW); } void CALLBACK Draw(void) { glClearColor(1.0,1.0,1.0,1); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_LINES); glColor3ub(190,190,190); for (int i=-4; i<=4; i++) { glVertex2f(float(i), -6);//явное преобразование типа glVertex2f(float(i), 15); } for (i=-6; i<=15; i++) { glVertex2f(-4, float(i)); glVertex2f(4, float(i)); } glEnd(); glColor3ub(0,0,0); glBegin(GL_LINES); glVertex2f (-5, 0); glVertex2f(5, 0); glVertex2f(0,16); glVertex2f(0,-7); glEnd(); glBegin(GL_LINE_STRIP); glColor3ub(0,0,255); int n; double a,b,dx,x,y; a=-1.415; b=1.5; n=100; dx=(b-a)/(n-1); x=a; y=0; for (i=1; i<=n; i++) { y=float(tan(x)+5*cos(x)); glVertex2d (x, y); x=x+dx; } glEnd(); glFinish(); auxSwapBuffers(); } void main(int argc, char **argv) AUX_DOUBLE); auxInitWindow("v11_01_1"); glTranslated(0,-4,0); auxReshapeFunc(Reshape); auxMainLoop(Draw); Результат: 2. Нарисуйте каркас призмы, в основании которой лежит правильный 14-угольник Решение: //v11_02 #include <windows.h> #include <GL/gl.h> #include <GL/glu.h> #include <GL/glaux.h> #include <math.h> void CALLBACK resize (int width, int height) { glViewport (0,0,width, height); glMatrixMode (GL_PROJECTION); glLoadIdentity(); glOrtho(-15,15,-10,10, -10,20); gluLookAt(1,-1,1, 0,0,0, 0,0,1); glMatrixMode(GL_MODELVIEW); } void CALLBACK display (void) { GLUquadricObj *quadObj; quadObj = gluNewQuadric(); glClearColor(1.0,1.0,1.0,1); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3d(0,0,1); // каркас gluQuadricDrawStyle(quadObj, GLU_SILHOUETTE); //призма в основании которой лежит правильный 14-угольник gluCylinder(quadObj, 2, 2, 5, 14, 14); glBegin(GL_LINES); glColor3ub(0, 0, 0); glVertex2f(6, 0); glVertex2f(-6, 0); glVertex2f(0, 6); glVertex2f(0, -6); glVertex3f(0, 0, 0); glVertex3f(0, 0, 8); for (int i=-5; i<=5; i++) { if (i!=0) { glColor3ub(190,190,190); glVertex2f(float(i), -5); glVertex2f(float(i), 5); } } for (i=-5; i<=5; i++) { if (i!=0) { glColor3ub(190,190,190); glVertex2f(-5, float(i)); glVertex2f(5, float(i)); } } glEnd(); glFinish(); auxSwapBuffers(); } void main () auxInitPosition (100,100,800,600); auxInitDisplayMode (AUX_RGB Результат: 3. Напишите программу вывода графика функции x=2*sin(z)*cos(y)-3*tg(y) используя алгоритм плавающего горизонта. Модифицируйте программу таким образом, чтобы поверхность состояла из четырехугольников Решение: #include <windows.h> #include <gl\gl.h> #include <gl\glu.h> #include <gl\glaux.h> #include <math.h> // запретить вывод предупреждений о преобразовании данных #pragma warning(disable: 4305) // MIPS #pragma warning(disable: 4244) // MIPS GLint windW, windH; void CALLBACK Reshape(int width, int height) { windW = (GLint)width; windH = (GLint)height; } int alpha=0, beta=0; void CALLBACK Key_LEFT(void) { alpha -= 5; } void CALLBACK Key_RIGHT(void) { alpha += 5; } void CALLBACK Key_UP(void) { beta += 5; } void CALLBACK Key_DOWN(void) { beta -= 5; } void CALLBACK InitViewport(int x, int y, int width, int height) { glViewport(x, y, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-windW,windW, -windH,windH, windH/1000,windH*1000); gluLookAt(0,0,windH, 0,0,0, 1,0,0); glMatrixMode(GL_MODELVIEW); } void CALLBACK Draw(void) { float x,y,z; float d=10; InitViewport(0,0, windW, windH); glColor3d(0,1,0); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); for (y=-windH/1.3; y<=windH/1.3; y+=10) {glBegin(GL_QUADS); for (z=-windW/1.3; z<=windW/1.3; z+=10) { x=2*sin(z)*cos(y)-3*tan(y); glVertex3f(x,y,z); glVertex3f(x,y+d,z); x=2*sin(z+d)*cos(y+d)-3*tan(y+d); glVertex3f(x,y+d,z+d); glVertex3f(x,y,z+d); } glEnd(); } glFinish(); } void CALLBACK Turn(void) glClear(GL_COLOR_BUFFER_BIT void main(int argc, char **argv) { windW = 800; windH = 600; auxInitPosition(0, 0, windW, windH); auxInitDisplayMode(AUX_RGB | AUX_DEPTH | AUX_DOUBLE); if(auxInitWindow("v11_03") == GL_FALSE) { auxQuit(); } auxExposeFunc((AUXEXPOSEPROC)Reshape); auxReshapeFunc((AUXRESHAPEPROC)Reshape); auxIdleFunc(Turn); auxKeyFunc(AUX_LEFT, Key_LEFT); auxKeyFunc(AUX_RIGHT, Key_RIGHT); auxKeyFunc(AUX_UP, Key_UP); auxKeyFunc(AUX_DOWN, Key_DOWN); auxMainLoop(Turn); } Результат: 4. Напишите программу вывода вращающего тора относительно своей оси x, с одновременным движением по следующей траектории z=sin(y) Решение: //v11_04 #include <windows.h> #include <GL/gl.h> #include <GL/glu.h> #include <GL/glaux.h> #include <math.h> int flag=1; void CALLBACK resize (int width, int height) { glViewport (0,0,width, height); glMatrixMode (GL_PROJECTION); glLoadIdentity(); glOrtho(-15,15,-10,10, -10,20); gluLookAt(1,-1,1, 0,0,0, 0,0,1); glMatrixMode(GL_MODELVIEW); } void CALLBACK display (void) { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3d(0,1,0); float pos[4]={0,7.5,7.5,1}; static double time=0; float y,z; y=0; glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glLightfv(GL_LIGHT0, GL_POSITION, pos); glPushMatrix(); y=float(time/100); z=float(sin(y)); // float(); преобразование типа //движением по следующей траектории z=sin(y) glTranslated(0,y,z);
Страницы: 1, 2
|