Создание компьютерной графики при помощи OpenGL (49045)

Посмотреть архив целиком

  • Напишите программу вывода графика функции y= tg (x)+5*cos (x), с помощью точек, а затем с помощью линий.


      1. С помощью точек


    Решение:


    #include

    #include

    #include

    #include

    #include


    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)

    {

    windW = 800;

    windH = 800;

    auxInitPosition(100, 100, windW, windH);

    auxInitDisplayMode(AUX_RGB | AUX_DOUBLE);

    auxInitWindow("v11_01_1");

    glTranslated(0,-4,0);

    auxReshapeFunc(Reshape);

    auxMainLoop(Draw);

    }


    Результат:


      1. с помощью линий


    Решение:


    #include

    #include

    #include

    #include

    #include


    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)

    {

    windW = 800;

    windH = 800;

    auxInitPosition(100, 100, windW, windH);

    auxInitDisplayMode(AUX_RGB | AUX_DOUBLE);

    auxInitWindow("v11_01_1");

    glTranslated(0,-4,0);

    auxReshapeFunc(Reshape);

    auxMainLoop(Draw);

    }


    Результат:


    1. Нарисуйте каркас призмы, в основании которой лежит правильный 14-угольник


    Решение:


    //v11_02

    #include

    #include

    #include

    #include

    #include


    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 | AUX_DEPTH | AUX_DOUBLE);

    auxInitWindow ("v11_02");

    glScaled(1.5, 1.5, 1.5);

    glTranslated(0,0,-1);

    auxIdleFunc (display);

    auxReshapeFunc(resize);

    glEnable (GL_DEPTH_TEST);

    auxMainLoop(display);

    }



    Результат:

    1. Напишите программу вывода графика функции x=2*sin(z)*cos(y)-3*tg(y) используя алгоритм плавающего горизонта. Модифицируйте программу таким образом, чтобы поверхность состояла из четырехугольников


    Решение:


    #include

    #include

    #include

    #include


    #include

    // запретить вывод предупреждений о преобразовании данных


    #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 | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

    glRotated(alpha, 0,1,0);

    glRotated(beta, -1,0,0);

    Draw();

    glPopMatrix();

    auxSwapBuffers();

    glFinish();

    }


    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);

    }


    Результат:




    1. Напишите программу вывода вращающего тора относительно своей оси x, с одновременным движением по следующей траектории z=sin(y)


    Решение:


    //v11_04

    #include

    #include

    #include

    #include

    #include


    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);

    //вращающего тора относительно оси x

    glRotated(time,1,0,0);


    if (y>11 && flag==1)

    {

    flag=2;

    }


    if (y<-4 && flag==2)

    {

    flag=1;

    }


    if (flag==2)

    {

    time--;

    }

    else

    {

    time++;

    }


    auxSolidTorus(0.15, 0.5);


    glPopMatrix();


    // система координат XYZ

    glBegin(GL_LINES);

    glColor3ub(255, 0, 0);

    glVertex3f(5, 0, 0);

    glVertex3f(-5, 0, 0);

    // х красный

    glColor3ub(0, 255, 0);

    glVertex3f(0, 11, 0);

    glVertex3f(0, -4, 0);

    // y зеленый

    glColor3ub(0, 0, 255);

    glVertex3f(0, 0, 0);

    glVertex3f(0, 0, 5);

    // z синий

    glEnd();


    glFinish();

    auxSwapBuffers();

    }


    void main ()


    {

    auxInitPosition (100,100,800,600);

    auxInitDisplayMode (AUX_RGB | AUX_DEPTH | AUX_DOUBLE);

    auxInitWindow ("v11_04");

    glScaled(1.5, 1.5, 1.5);

    glTranslated(0,-3,0);

    auxIdleFunc (display);

    auxReshapeFunc(resize);

    glEnable (GL_DEPTH_TEST);

    glEnable (GL_COLOR_MATERIAL);

    auxMainLoop(display);

    }


    Результат:

    1. Напишите программу мерцающего звездного неба


    Решение:


    #include

    #include

    #include

    #include


    #include


    #include

    #include

    #include

    #include


    int t_sec() // считывание секунд с системных часов

    {

    struct tm *newtime;

    time_t aclock;


    time(&aclock);

    newtime = localtime(&aclock);

    asctime(newtime);


    int s=newtime->tm_sec;

    return s;

    }

    void CALLBACK resize (int width, int height)

    {

    glViewport (0,0,width, height);

    glMatrixMode (GL_PROJECTION);

    glLoadIdentity();

    gluOrtho2D(-100,100,-100,100);


    glMatrixMode(GL_MODELVIEW);


    }


    void CALLBACK Draw (void)

    {

    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


    int c, x, y, p;


    srand(t_sec());

    //задание стартовой точки

    //для генерации случайных чисел


    for(int i=0; i<1000; i++)

    {

    c=rand()%255; //генерация случайных чисел от 0 до 255

    x=rand()%200; //генерация случайных чисел от 0 до 200

    y=rand()%200; //генерация случайных чисел от 0 до 200

    p=rand()%3;


    glPointSize(p);

    glBegin(GL_POINTS);

    glColor3ub(c,c,c);

    glVertex2d(x,y);

    glEnd();

    }


    auxSwapBuffers();

    }


    void main ()

    {


    auxInitPosition (100,100,800,800);

    auxInitDisplayMode (AUX_RGB | AUX_DEPTH | AUX_DOUBLE);

    auxInitWindow ("v11_06");

    glTranslated(-100,-100,0);

    auxIdleFunc (Draw);

    auxReshapeFunc (resize);

    glEnable (GL_DEPTH_TEST);

    glEnable (GL_COLOR_MATERIAL);

    auxMainLoop(Draw);

    }


    Результат:

    1. Изобразите радугу состоящую из полигонов, которая освещается прожектором. Направление света прожектора постоянно меняется и скользит вдоль радуги


    Решение:


    #include

    #include

    #include

    #include


    #include


    #include

    #include

    #include

    #include


    int flag=1;


    void CALLBACK resize (int width, int height)

    {


    glViewport (0,0,width, height);

    glMatrixMode (GL_PROJECTION);

    glLoadIdentity();

    //glOrtho(-20,20,-15,15, -10,25);

    glOrtho(-6,6,-6,6, -20,20);

    gluLookAt(1,-1,1, 0,0,0, 0,0,1);

    //gluLookAt(0,-5,0, 0,0,0, 0,0,1);

    glMatrixMode(GL_MODELVIEW);


    }


    void CALLBACK Draw (void)

    {

    static double time=0;


    GLUquadricObj *quadObj;

    quadObj = gluNewQuadric();


    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


    glPushMatrix();


    float x=time/100-2.2;

    float z=pow((pow(2.4,2)-pow(x,2)),0.5);


    if (x>2.2 && flag==1)

    {

    flag=2;

    }


    if (x<-2.2 && flag==2)

    {

    flag=1;

    }


    if (flag==2)

    {

    time--;

    }

    else

    {

    time++;

    }


    float dir[3]={x,0.1,z};

    float pos[4]={0,-1,0,1};


    // включение нулевой лампы

    GLfloat light_diffuse[]={3.0,3.0,3.0,1.0};

    glLightfv(GL_LIGHT0,GL_DIFFUSE, light_diffuse);


    glLightfv(GL_LIGHT0, GL_POSITION, pos);

    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);

    glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 90);

    glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 9);

    glEnable(GL_LIGHTING);

    glEnable (GL_LIGHT0);

    glEnable (GL_DEPTH_TEST);


    glPopMatrix();


    glPushMatrix();


    glRotated(90,1,0,0);

    gluQuadricDrawStyle(quadObj, GLU_FILL);

    // К

    glColor3ub(255, 0, 0);

    gluPartialDisk(quadObj, 2, 2.2, 30, 30, -90, 180);

    // О

    glColor3ub(255, 125, 0);

    gluPartialDisk(quadObj, 2.2, 2.4, 30, 30, -90, 180);

    // Ж

    glColor3ub(255, 255, 0);

    gluPartialDisk(quadObj, 2.4, 2.6, 30, 30, -90, 180);

    // З

    glColor3ub(0, 255, 0);

    gluPartialDisk(quadObj, 2.6, 2.8, 30, 30, -90, 180);

    // Г

    glColor3ub(0, 255, 255);

    gluPartialDisk(quadObj, 2.8, 3, 30, 30, -90, 180);

    // С

    glColor3ub(0, 0, 255);

    gluPartialDisk(quadObj, 3, 3.2, 30, 30, -90, 180);

    // Ф

    glColor3ub(255, 0, 255);

    gluPartialDisk(quadObj, 3.2, 3.4, 30, 30, -90, 180);


    glPopMatrix();


    glDisable(GL_LIGHTING);


    auxSwapBuffers();

    }


    void main ()

    {

    auxInitPosition (100,100,800,800);

    auxInitDisplayMode (AUX_RGB | AUX_DEPTH | AUX_DOUBLE);

    auxInitWindow ("v11_06");

    glTranslated(3,-3,2);

    glEnable (GL_COLOR_MATERIAL); // установка свойств материала

    auxIdleFunc (Draw);

    auxReshapeFunc (resize);

    auxMainLoop(Draw);

    }


    Результат:

    1. Напишите программу вывода цилиндра, на котором наложена текстура. Создайте эффект сползания текстуры с цилиндра. Вокруг цилиндра вращается несколько полупрозрачных небольших сфер по спирали


    Решение


    #include

    #include

    #include

    #include


    #include


    #include

    #include

    #include

    #include


    int flag0=1;

    int flag1=1;

    int flag2=1;

    int flag3=1;


    unsigned int image1_ID;

    AUX_RGBImageRec* image1;


    void CALLBACK resize (int width, int height)

    {

    glViewport (0,0,width, height);

    glMatrixMode (GL_PROJECTION);

    glLoadIdentity();

    glOrtho(-6,6,-6,6, -20,20);

    gluLookAt(1,-1,1, 0,0,0, 0,0,1);

    glMatrixMode(GL_MODELVIEW);


    }


    void CALLBACK Draw (void)

    {

    static double time0=0;

    static double time1=0;

    static double time2=0;

    static double time3=0;


    GLUquadricObj *quadObj;


    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


    glColor3d(1,1,1);


    float pos[4]={3,-3,5,1};

    glLightfv(GL_LIGHT0, GL_POSITION, pos);

    glEnable(GL_LIGHTING);

    glEnable (GL_LIGHT0);

    glEnable (GL_DEPTH_TEST);


    quadObj = gluNewQuadric();


    float s=0.9-(time0/800);

    if (s<0.01 && flag0==1)

    {flag0=2;}

    if (s>0.9 && flag0==2)

    {flag0=1;}

    if (flag0==1)

    {time0++;}

    else

    {time0--;}


    const float p[4]={0,0,s,0};


    glPushMatrix();


    glEnable(GL_TEXTURE_2D);

    glEnable(GL_TEXTURE_GEN_S);

    glEnable(GL_TEXTURE_GEN_T);


    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);

    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);

    glTexGenfv(GL_T,GL_OBJECT_PLANE,p);


    glRotated(-180,1,0,0);

    glTranslated(0,0,-3);

    glColor3d(1,1,0);

    gluCylinder(quadObj, 1, 1, 3, 50, 50);


    glDisable(GL_TEXTURE_GEN_S);

    glDisable(GL_TEXTURE_2D);


    glPopMatrix();

    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


    glPushMatrix();

    glEnable(GL_ALPHA_TEST);

    glEnable(GL_BLEND);

    double z1=time1/300;

    glRotated(time1,0,0,1);

    glTranslated(1.3,0,1);

    glTranslated(0,0,z1);

    if (z1>2 && flag1==1)

    {flag1=2;}

    if (z1<-1 && flag1==2)

    {flag1=1;}

    glColor4d(0,1,0, 0.1);

    auxSolidSphere(0.2); //s1

    glDisable(GL_BLEND);

    glDisable(GL_ALPHA_TEST);

    if (flag1==1)

    {time1++;}

    else

    {time1--;}

    glPopMatrix();


    glPushMatrix();

    glEnable(GL_ALPHA_TEST);

    glEnable(GL_BLEND);

    double z2=time2/600;

    glRotated(time2*2,0,0,15);

    glTranslated(1.8,0,1);

    glTranslated(0,0,z2);

    if (z2>2 && flag2==1)

    {flag2=2;}

    if (z2<-1 && flag2==2)

    {flag2=1;}

    glColor4d(1,0,0, 0.1);

    auxSolidSphere(0.2); //s2

    glDisable(GL_BLEND);

    glDisable(GL_ALPHA_TEST);

    if (flag2==1)

    {time2++;}

    else

    {time2--;}

    glPopMatrix();


    glPushMatrix();

    glEnable(GL_ALPHA_TEST);

    glEnable(GL_BLEND);

    double z3=time3/400;

    glRotated(time3*3,0,0,1);

    glTranslated(2.3,0,1);

    glTranslated(0,0,z3);

    if (z3>2 && flag3==1)

    {flag3=2;}

    if (z3<-1 && flag3==2)

    {flag3=1;}

    glColor4d(0,0,1, 0.2);

    auxSolidSphere(0.2); //s3

    glDisable(GL_BLEND);

    glDisable(GL_ALPHA_TEST);

    if (flag3==1)

    {time3++;}

    else

    {time3--;}

    glPopMatrix();


    gluDeleteQuadric(quadObj);

    auxSwapBuffers();


    }


    void main ()

    {


    auxInitPosition (100,100,800,800);

    auxInitDisplayMode (AUX_RGB | AUX_DEPTH | AUX_DOUBLE);

    auxInitWindow ("v11_07");

    glTranslated(0,0,-1);


    glEnable (GL_COLOR_MATERIAL); // установка свойств материала

    image1 = auxDIBImageLoad("v11_07.bmp");


    glGenTextures(1, &image1_ID);

    glBindTexture(GL_TEXTURE_2D, image1_ID);


    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);


    glTexImage2D(GL_TEXTURE_2D, 0, 3,

    image1->sizeX,

    image1->sizeY,

    0, GL_RGB, GL_UNSIGNED_BYTE,

    image1->data);


    auxIdleFunc (Draw);

    auxReshapeFunc (resize);

    auxMainLoop(Draw);

    }


    Результат:


  • Случайные файлы

    Файл
    105107.rtf
    142356.rtf
    154810.rtf
    70870.rtf
    27609.rtf




    Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
    Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
    Это можно сделать совершенно бесплатно. Читайте подробности тут.