Cod sursa(job #1110285)

Utilizator RyuzakiL Lawliet Ryuzaki Data 17 februarie 2014 22:09:29
Problema Ciurul lui Eratosthenes Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 6.36 kb
#include <cmath>
#include <iostream>
#include <GL/glut.h>

using namespace std;

#define OBJECT_COUNT 100
#define SPEED 0.5f
#define TIME 0.02
#define MAX_HEIGHT 10

struct object
{
    float x, z;
     float r, g, b;
};

object objects[OBJECT_COUNT];
int count = OBJECT_COUNT;
float px = 0.0f, pz = 0.0f,py=0.0,cpx=px,cpy=py,cpz=pz;
float size = 1.0f;
bool ok=0,xok=0;
float raz=0.0;
float v;

void draw_cone(float r, float h, int n)
{
    float a;

    a = 2.0f * 3.1415f / n;

    glBegin(GL_TRIANGLES);

    for (int i = 0; i < n; ++i)
    {
        glVertex3f(0.0f, 0.0f, 0.0f);
        glVertex3f(r * cos(a * i), 0.0f, r * sin(a * i));
        glVertex3f(r * cos(a * (i + 1)), 0.0f, r * sin(a * (i + 1)));
         glVertex3f(0.0f, h, 0.0f);
        glVertex3f(r * cos(a * i), 0.0f, r * sin(a * i));
        glVertex3f(r * cos(a * (i + 1)), 0.0f, r * sin(a * (i + 1)));
    }

    glEnd();
}

void draw_cube(float w, float h, float d)
 {
    w /= 2;
    h /= 2;
    d /= 2;

    glBegin(GL_QUADS);
        glVertex3f(-w, -h, -d);
        glVertex3f( w, -h, -d);
        glVertex3f( w,  h, -d);
        glVertex3f(-w,  h, -d);

         glVertex3f(-w, -h,  d);
        glVertex3f( w, -h,  d);
        glVertex3f( w,  h,  d);
        glVertex3f(-w,  h,  d);

        glVertex3f(-w,  h, -d);
        glVertex3f( w,  h, -d);
        glVertex3f( w,  h,  d);
         glVertex3f(-w,  h,  d);

        glVertex3f(-w, -h, -d);
        glVertex3f( w, -h, -d);
        glVertex3f( w, -h,  d);
        glVertex3f(-w, -h,  d);

        glVertex3f(-w, -h, -d);
        glVertex3f(-w,  h, -d);
         glVertex3f(-w,  h,  d);
        glVertex3f(-w, -h,  d);

        glVertex3f( w, -h, -d);
        glVertex3f( w,  h, -d);
        glVertex3f( w,  h,  d);
        glVertex3f( w, -h,  d);
    glEnd();
 }

void obstacol(int w , int h , int d)
 {
     glPushMatrix();
     h+=1.0;

     glTranslatef(w , h , d);
     draw_cube(2 , 2 , 2);
     if(px-size/2<=w+1  && px+size/2>=w-1 && pz-size/2<=d+1 && pz+size/2>=d-1 && py<1.0+h)
     {
        px=cpx;
        pz=cpz;
   //     cout<<"sebi";
     }
     if(px-size/2<=w+1  && px+size/2>=w-1 && pz-size/2<=d+1 && pz+size/2>=d-1 && py-0.01<1.0+h && v<0)
    {
        py=1.0+h+0.01;
        v=0;
        xok=1;
        cout <<"sebi";

    }




     glPopMatrix();
 }

 void obstacole()
 {
     for(int i=1;i<=5;i+=2)
     {
         for(int j=1;j<=5;j+=2)
         {
             obstacol(i , 0.0 , j);
         }
     }
     obstacol(3.0 , 2.0 , 3.0);
 }



void draw_plane(float w, float d)
{
    glBegin(GL_QUADS);
        glVertex3f(-w / 2, 0.0f, -d / 2);
        glVertex3f( w / 2, 0.0f, -d / 2);
        glVertex3f( w / 2, 0.0f,  d / 2);
        glVertex3f(-w / 2, 0.0f,  d / 2);
     glEnd();
}

void render()
{
    for (int i = 0; i < count; ++i)
    {
        float dx = abs(px - objects[i].x);
        float dz = abs(pz - objects[i].z);
        float d = sqrt(dx * dx + dz * dz);

        if (d < 2.0+size/2 + raz && py-raz<2.0)
        {
            objects[i] = objects[count - 1];
            count--;
            size += 0.2f;

        }
    }

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f, 800.0 / 600.0, 0.1f, 100.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(
      px - 10.0f, 10.0f+size/2, pz + 10.0f+size,
       px, py, pz,
      0.0f, 1.0f, 0.0f
    );

    glColor3f(0.0f, 1.0f, 0.0f);
    draw_plane(100.0f, 100.0f);
    for (int i = 0; i < count; ++i)
    {
        glPushMatrix();
        glTranslatef(objects[i].x, 0.0f, objects[i].z);
        glColor3f(
             objects[i].r,
            objects[i].g,
            objects[i].b
        );
        draw_cone(2.0f, 2.0f, 16);
        glPopMatrix();
    }

    obstacole();

    glPushMatrix();
    glTranslatef(px, 1.5f * size+py, pz);
    glColor3f(1.0f, 0.0f, 0.0f);
     draw_cube(1.0f * size, 3.0f* size, 1.0f* size);
    glPopMatrix();

    if(xok)
    {
        v=v-10*TIME;
        cpy=py;
        py=py+v*TIME;

        if(py<0){
            xok=0;
            py=0;
        }
    }

    if(ok){
        if(size>1.0){
            raz+=0.075;
            size-=0.03;
            glColor3f(1.0 , 1.0 , 1.0);
            glTranslatef(px , py, pz);
            glutWireSphere(raz,20,20);

        }
        else{
            raz=0.0;
            ok=0;
        }
    }



    glutSwapBuffers();
}

void mouse(int button , int state , int x , int y)
{
    if(button==GLUT_LEFT_BUTTON && state==GLUT_DOWN  )
    {
        xok=1;
        v=MAX_HEIGHT;
    }
}

void keyboard(unsigned char key, int x, int y)
 {
     cpx=px;
     cpz=pz;
    switch (key)
    {
        case 'w':
        {
            if(px<50-size/2)
            {
            px += SPEED;}

            break;
        }
        case 's':
        {
            if(px>-50+size/2)
            {
            px -= SPEED;}

            break;
         }
        case 'a':
        {
            if(pz>-50+size/2)
            {
            pz -= SPEED;}

            break;
        }
        case 'd':
        {
            if(pz<50-size/2)
            {
            pz += SPEED;}

            break;
        }
         case 'q':
        {
            exit(0);
            break;
        }
         case ' ':
         {
             raz=size/2;
             ok=1;
             break;
         }

    }
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitWindowSize(800, 600);
     glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);
    glutCreateWindow("HELLO!");
    glutFullScreen();

    glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
    glDepthFunc(GL_LEQUAL);
    glEnable(GL_DEPTH_TEST);

    for (int i = 0; i < count; ++i)
    {
        objects[i].x = (rand() % 50000) / 1000.0f * 2.0f - 50.0f;
        objects[i].z = (rand() % 50000) / 1000.0f * 2.0f - 50.0f;

        objects[i].r = (rand() % 100) / 100.0f;
         objects[i].g = (rand() % 100) / 100.0f;
        objects[i].b = (rand() % 100) / 100.0f;
    }

    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutDisplayFunc(render);
    glutIdleFunc(render);
    glutMainLoop();
     return 0;
}