Система часток

Мінестерство  Освіти та Науки України 
 
 
 
 

Звіт по курсовій роботі на тему

„Система часток” 
 
 
 
 

                                                Виконав: 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

               Кіровоград 2011

Зміст 

Вступ…………………………………………………………………………….3

Опис алгоритму  ………………………………………………………………..4

Текст програми.………………………………………………………………...5

Список використаної літератури …………………………………………….9 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

     Вступ

     Задачей курсового проектирования является разработка программной системы  от начала (анализ требований) до конца (тестирование и сопровождение-документация).

     В ходе выполнения курсовой работы получить профессиональные навыки в постановке задачи, анализе требований, выборе представления исходных данных и  результата, разработке спецификаций, проектирования программной системы, написании программы на выбранном языке программирования с использованием объектно-ориентированной технологии и библиотек классов, тестировании и отладке программы, оформлении документации. 
 

Опис  алгоритму 

     Система частиц представляет из себя вектор из структур. Добавление нового элимента в вектор происходит каждые 100 мс. В то время как функция вызванная из функции-рендера постоянно ведет пересчет местоположения и поворота текстурированого полигона.

Тектс порграми 
 

#include <GL/glew.h>

#include <GL/glu.h>

#include <GL/freeglut.h>

#include <iostream>

#include <string>

#include <vector>

#include <map>

#include <utility>

#include <cmath>

#include <cstdlib> 

#include "picopng.h" 
 

GLuint texture_color_location; 
 
 

std::map<std::string, GLuint*> textures;

float angle; 

struct Mouse {

GLfloat x,y;

} mouse_position; 

struct Particle {

    GLfloat x,y;

    GLfloat speed;

    GLfloat angle;

    GLfloat distance;

}; 

std::vector<Particle> particle_storage; 
 
 
 
 

void addTexture(std::string name, std::string path) {

      GLuint *texture_id = new GLuint; 

      glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

      glGenTextures(1, texture_id);

      glBindTexture(GL_TEXTURE_2D, *texture_id);

      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

      std::vector<unsigned char> buffer, image;

      loadFile(buffer, path.c_str()); //picopng

      unsigned long width, heigth;

      int error = decodePNG(image, width, heigth,

                  buffer.empty() ? 0 : &buffer[0], (unsigned long) buffer.size()); 

      if (error != 0)

            std::cout << "Ошибка при открытии файла \"" << path << "\":" << error

                        << std::endl; 

      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, heigth, 0, GL_RGBA,

                  GL_UNSIGNED_BYTE, image.data()); 

      if (glGetError() != GL_NO_ERROR) {

            std::cout << "Ошибка создания \"" << name << "\" текстуры."

                        << std::endl;

      } else {

            textures.insert(std::make_pair(name, texture_id));

      }

} 

GLuint getTexture(std::string name) {

      std::map<std::string, GLuint*>::iterator iterator = textures.find(name); //Это С++!!! Ничего другого на ум не пришло.

      if (iterator != textures.end()) {

            return *iterator->second;

      } else {

            //std::cout << "Текстура \"" << name << "\" не найдена." << std::endl;

            return 0;

      }

} 
 
 
 

void rotate(int null) {

    angle += 1.0f;

    glutTimerFunc(10, rotate, 0);

    glutPostRedisplay();

} 

void GLQuad(std::string texture, GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) {

      GLuint texture_id = getTexture(texture); 

    glPushMatrix();

      glTranslatef(0.0f, 0.0f, -6.0f); 

      glBindTexture(GL_TEXTURE_2D, texture_id);

      glBegin(GL_QUADS);

      glTexCoord2f(0.0f, 1.0f);

      glVertex3f(x1, y1, 0);

      glTexCoord2f(1.0f, 1.0f);

      glVertex3f(x2, y1, 0);

      glTexCoord2f(1.0f, 0.0f);

      glVertex3f(x2, y2, 0);

      glTexCoord2f(0.0f, 0.0f);

      glVertex3f(x1, y2, 0);

      glEnd(); 

      glPopMatrix();

} 

void particle_out() {

        std::vector<Particle>::iterator iterator = particle_storage.begin();

        while (iterator!=particle_storage.end()) {

            Particle *particle = iterator.base();

            glPushMatrix();

            GLfloat x,y,a;

            x = particle->x+particle->distance*std::cos(particle->angle); 

            y = particle->y+particle->distance*std::sin(particle->angle);

            a = 360*cos(particle->angle);

            glTranslatef(x, y, -6.0f);

            glRotatef(a, 0.0f, 0.0f, 1.0f);

            glScalef(particle->distance/50.0f,particle->distance/50.0f,1.0f);

            GLQuad("star", -16.0f, -16.0f, 16.0f, 16.0f);

            glPopMatrix();

            // Воздействие

            particle->speed += 0.1f;

            particle->distance += 1.0f;

            // Уборка мусора

            if (particle->distance > 50.0f) {

                std::vector<Particle>::iterator temp = iterator;

                particle_storage.erase(temp);

            }

            iterator++;

        }

} 

void RenderScene(void) {

    glClearColor(0.5f, 0.5f, 0.5f, 0.5f);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    particle_out();

    glutSwapBuffers();

} 

void motion(int x, int y) {

    mouse_position.x = x;

    mouse_position.y = y;

} 

void new_particle(int null) {

    Particle *new_part = new Particle();

    new_part->x = mouse_position.x;

    new_part->y = 500 - mouse_position.y; // Исправить на правильную высоту окна.

    new_part->speed = 0;

    new_part->angle = 6.28f*std::rand()/RAND_MAX;

    new_part->distance = 0; 

    particle_storage.push_back(*new_part);

    glutTimerFunc(1, new_particle, 0);

} 

void mouse(int button, int state, int x, int y) {

} 

void reshape(int width, int height) // Установка матрици проэкции и матрици вида.

{

      glViewport(0, 0, (GLsizei) width, (GLsizei) height);

      glMatrixMode(GL_PROJECTION);

      glLoadIdentity();

      glOrtho(0, width, 0, height, -1.0f, 100.0f);

      glMatrixMode(GL_MODELVIEW);

      glLoadIdentity();

} 

int main(int argc, char** argv) {

      glutInit(&argc, argv);

      glutInitWindowSize(500, 500);

      glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);

      glutCreateWindow("Particle");

      //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

      //Инициализация современного opengl.

      GLenum err = glewInit();

      if (GLEW_OK != err) {

            std::cout << "Error: " << glewGetErrorString(err) << std::endl;

      }

      std::cout << "Status: Using GLEW " << glewGetString(GLEW_VERSION) << std::endl;

      //=============================================================================

      //Продолжение старой программы.

      glutDisplayFunc(RenderScene);

      glEnable(GL_TEXTURE_2D); // Разрешение наложение текстуры

        glEnable(GL_BLEND);

        glDisable(GL_DEPTH_TEST);

        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

      //glEnable(GL_COLOR_MATERIAL);

      //glAlphaFunc(GL_GREATER, 0); //Разрешение альфа канала

      //glEnable(GL_ALPHA_TEST); //в пнг изображении

      glutReshapeFunc(reshape);

      glutPassiveMotionFunc(motion);

      glutMouseFunc(mouse); 

      addTexture("star", "star.png"); 

        glutTimerFunc(1, new_particle, 0);

        glutTimerFunc(40, rotate, 0);

      //glShadeModel(GL_SMOOTH);

      glutMainLoop();

} 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

СПИСОК   ВИКОРИСТАНОЇ ЛІТЕРАТУРИ: 

  1. Лесневский  А.С. Объектно-ориентированное программирование
  2. Иванова Г.С. Объектно-ориентированное программирование – М, 2003