Цветное движущееся изображение: песочные часы

Автор работы: Пользователь скрыл имя, 15 Мая 2013 в 13:45, курсовая работа

Краткое описание

Перечень вопросов, подлежащих разработке:
1.Обеспечить построение движущегося изображения (отсчитывающих время песочных часов) средствами OpenGL и DirectX.
2.Предусмотреть возможность регулировки скорости и приостановки анимации пользователем с помощью мыши и/или клавиатуры.
3.Предусмотреть удобный пользовательский интерфейс (элементы управления и меню) для управления анимацией в соответствии с п. 2.

Содержание работы

1. Алгоритмические особенности реализации 4
1.1. Модель колбы песочных часов 4
1.2. Модель перетекающей воды 5
1.3. Модель пересыпающегося песка 5
1.4. Объект сцены и построение изображения 5
2. Исходные тексты программы 7
2.1. Модель песочных часов 7
2.2. Объект сцены 9
2.3. Построение изображения средствами OpenGL 12
2.4. Построение изображения средствами DirectX 15
3. Требования к системе пользователя 18
3.1. Требования к программному обеспечению 18
3.2. Минимальные требования к аппаратному обеспечению 18
4. Примеры работы программы 19
Библиографический список 21

Содержимое работы - 1 файл

Report.docx

— 84.66 Кб (Скачать файл)

Министерство  образования и науки Российской Федерации

Южно-Уральский  государственный университет

Приборостроительный факультет

Кафедра «Электронные вычислительные машины»

 

 

 

 

 

Цветное движущееся изображение:

песочные часы

 

 

 

 

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

К КУРСВОЙ РАБОТЕ

по дисциплине

«Компьютерная графика»

ЮУрГУ-010400-2011-561 ПЗ КР

 

 

 

 

 

 

 

 

Руководитель

доцент кафедры  «ЭВМ»

___________ Е.С.  Ярош

«__» __________ 2011 г.

 

Автор работы

студент группы ПС-458

________ М.Ю.  Осипов

«__» __________ 2011 г.

 

 

 

 

 

 

 

 

 

 

 

 

 

Челябинск 2011 

Министерство образования и  науки Российской Федерации

Южно-Уральский государственный  университет

 

Факультет: Приборостроительный

Кафедра: «Электронные вычислительные машины»

Направление: «Информационные технологии»

 

 

 

 

ЗАДАНИЕ

на курсовую работу

студента группы ПС-458 Осипова Максима  Юрьевича

 

Дисциплина: «Компьютерная графика»

Тема работы: «Цветное движущееся изображение: песочные часы»

Дата выдачи работы: «__» __________ 2011 г.

Перечень вопросов, подлежащих разработке:

  1. Обеспечить построение движущегося изображения (отсчитывающих время песочных часов) средствами OpenGL и DirectX.
  2. Предусмотреть возможность регулировки скорости и приостановки анимации пользователем с помощью мыши и/или клавиатуры.
  3. Предусмотреть удобный пользовательский интерфейс (элементы управления и меню) для управления анимацией в соответствии с п. 2.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Руководитель проекта _____________________________ / Е.С. Ярош /

Студент __________________________ / М.Ю. Осипов /

ОГЛАВЛЕНИЕ

1. Алгоритмические  особенности реализации 4

1.1. Модель  колбы песочных часов 4

1.2. Модель  перетекающей воды 5

1.3. Модель  пересыпающегося песка 5

1.4. Объект  сцены и построение изображения 5

2. Исходные тексты программы 7

2.1. Модель  песочных часов 7

2.2. Объект  сцены 9

2.3. Построение  изображения средствами OpenGL 12

2.4. Построение  изображения средствами DirectX 15

3. Требования  к системе пользователя 18

3.1. Требования  к программному обеспечению 18

3.2. Минимальные  требования к аппаратному обеспечению 18

4. Примеры  работы программы 19

Библиографический список 21

 

1. АЛГОРИТМИЧЕСКИЕ ОСОБЕННОСТИ  РЕАЛИЗАЦИИ

1.1. Модель колбы песочных часов

Изображение колбы песочных часов формируется  совокупностью четырехугольников, как это показано на рисунке 1.1.

 

Рис. 1.1. Схема разбиения изображения  колбы на четырехугольники.

 

При этом форма линии, ограничивающей вогнутую часть колбы, задается кубической параболой (y = x3) на промежутке [-1; -0,5]. Для выпуклой части парабола задается на отрезке [0,5; 1]. В соответствии с шириной колбы и ее положением на координатной плоскости заданные линии смещаются в нужном направлении и масштабируются. Для этого в уравнение кубической параболы вводятся дополнительные коэффициенты и величины смещения.

Полученное  уравнение используется для вычисления координат опорных точек путем  последовательной подстановки значений x с определенным шагом. Чем меньше шаг, тем более гладкой будет линия. При слишком малых значениях шага прирост гладкости линии будет уже незаметен, тогда как производительность алгоритма будет уменьшаться из-за растущего числа вычислений.

Из получаемых точек формируются четырехугольники. Информация о них сохраняется  в специальный объект — геометрическую модель, которая затем будет отрисовываться с помощью OpenGL и DirectX.

1.2. Модель перетекающей воды

Алгоритм  получения модели перетекающей воды достаточно прост. За основу берется  описанная выше модель колбы (так  как вода повторяет ее форму). Меняется лишь верхняя (или нижняя) координата y — таким образом регулируется уровень воды в верхней (ограничение сверху) и нижней (ограничение снизу) части колбы. Обычное сравнение координат позволяет выяснить, какие точки должны быть исключены из модели.

Кроме того, модель имеет некоторое множество состояний. Текущее состояние определяет уровень воды. В состоянии, когда уровень воды равен высоте колбы, модели колбы и перетекающей воды идентичны.

1.3. Модель пересыпающегося песка

Модель  песка является модификацией модели перетекающей воды. Отличие состоит в том, что в этом случае необходимо выполнить имитацию «горки» песка при его пересыпании в нижнюю часть колбы часов.

Это реализуется  путем введения в модель смещения по оси y крайних точек относительно центральной (средней) точки — вершины «горки». К моменту наполнения нижней части колбы смещение начинает уменьшаться, и уровень песка плавно выравнивается.

1.4. Объект сцены и построение  изображения

Все созданные  экземпляры моделей помещаются в объект сцены. Этот объект имеет свое множество состояний (кадров), которые последовательно меняются по внешнему сигналу от системного таймера (вообще говоря, источник внешних сигналов может быть любым). Принцип действия модели подобен закону функционирования автомата Мура, а данный сигнал играет роль сигнала синхронизации. После изменения состояния объект сцены обновляет (если требуется) состояние всех моделей.

Кроме того, объект сцены обладает параметром, задающим угол поворота всего изображения вокруг начала координат. Значение этого параметра также устанавливается в зависимости от текущего состояния. Смена состояний происходит циклически.

Таким образом, объект сцены содержит полную информацию обо всем изображении, поэтому  именно на его основе будет осуществляться рендеринг.

Для построения изображения используются два независимых  объекта, имеющих одинаковый интерфейс, каждый из которых отвечает за рендеринг  изображения средствами  OpenGL и DirectX соответственно. Также эти объекты берут на себя ответственность за инициализацию графической библиотеки и освобождение ресурсов. В пределах одного сеанса работы с приложением активируется только один из этих объектов.

Принцип построения изображения достаточно прост. Каждая из моделей, включенных в  сцену, отрисовывается в виде совокупности заданных в ней четырехугольников с помощью средств рисования многоугольников (полигонов) графической библиотеки. Перед началом отображения моделей к изображению применяется матрица поворота, величина угла которого хранится в качестве параметра объекта сцены.

В DirectX отсутствуют средства автоматического рисования произвольных выпуклых многоугольников. Поэтому четырехугольники, из которых состоят модели, подвергаются предварительной триангуляции — каждый из них разбивается на два треугольника. Триангуляция выполняется на этапе формирования вершинных буферов. В OpenGL триангуляция выполняется автоматически при построении многоугольника.

2. ИСХОДНЫЕ ТЕКСТЫ ПРОГРАММЫ

Ниже  представлены исходные тексты, иллюстрирующие предыдущий раздел. Это четыре наиболее важных с точки зрения компьютерной графики класса, представляющие собой описанные модели.

2.1. Модель песочных часов

 

Данный  класс содержит в себе модели пересыпающегося  песка, перетекающей воды и колбы  песочных часов, так как их формы схожи, алгоритмы их построения отличаются незначительно, и эти отличия заключаются в задании разных параметров.

Листинг 2.1. Файл HourglassModel.h

 

#ifndef HOURGLASSMODEL_HEADER

#define HOURGLASSMODEL_HEADER

 

#include "ColoredModel.h"

 

class HourglassModel : public ColoredModel

{

private:

    PolygonMap polyMap_; // список четырехугольников

    bool isInverse_; // признак нижней части колбы

    double width_; // ширина модели

    double height_; // высота модели

    double interY_; // ограничение высоты модели

    bool isSand_; // признак формы модели (песок или вода)

public:

    HourglassModel(double width = 2.0, double height = 8.0,

        bool isInverse = false, double interY = 0.0);

    void build(); // построение модели

    virtual void setState(double state = 0.0); // установка состояния модели

    virtual const PolygonMap& getPolygonMap() const; // извлечение полигонов

};

 

#endif // HOURGLASSMODEL_HEADER

 

Листинг 2.2. Файл HourglassModel.cpp

 

#include "HourglassModel.h"

 

HourglassModel::HourglassModel(double width, double height, bool isInverse,

    double interY) : width_(width), height_(height), isInverse_(isInverse),

    interY_(interY), isSand_(false)

{

    build();

}

 

void HourglassModel::build()

{

    pointMap_.clear();

    polyMap_.clear();

 

    double halfWidth = width_ / 2.0;

    double topY = (isInverse_) ? height_ : height_ - interY_;

    double bottomY = (isInverse_) ? interY_ : 0.0;

    double quaWidth = halfWidth / 2.0;

    double offset = halfWidth - 2.0 * quaWidth * quaWidth * quaWidth;

 

    PointMap slideMap;

 

    double deltaB = (bottomY >= 3.0) ? quaWidth :

        (bottomY - 3.0) / 2.0 + quaWidth; // смещение

    if ((isSand_) && (deltaB >= 0.0))

        bottomY += deltaB;

    double delta = (bottomY >= 1.0) ? quaWidth : (bottomY - quaWidth);

    if ((!isSand_) || (delta < 0.0)) // компенсирующее смещение

        delta = 0.0;

    slideMap.push_back(Point(0.0, bottomY - delta));

    slideMap.push_back(Point(0.04, bottomY - delta));

    for (double x = 0.04; x < halfWidth; x += 0.01)

    {

        double x3 = (x < quaWidth) ? x - halfWidth : x;

        double y = x3 * x3 * x3 + ((x < quaWidth) ? halfWidth : offset);

        if ((y <= topY) && (y >= bottomY))

            slideMap.push_back(Point(x, y));

    }

    double lastY = halfWidth + offset;

    if ((lastY <= topY) && (lastY >= bottomY))

        slideMap.push_back(Point(halfWidth, lastY));

    else if (bottomY > lastY)

    {

        double x = (bottomY > topY) ?

            (delta - (bottomY - topY)) * 2 : halfWidth;

        double y = (bottomY > topY) ? topY : bottomY;

        slideMap.push_back(Point(x, y));

    }

 

    PointMap::iterator pos = slideMap.begin();

    if (pos != slideMap.end())

    {

        double prevX = pos->x;

        double prevY = pos->y;

        ++pos;

        while (pos != slideMap.end())

        {

            double x = pos->x;

            double y = pos->y;

            PointMap polygon;

            if (!isInverse_)

            {

                polygon.push_back(Point(x, topY));

                polygon.push_back(Point(x, y));

                polygon.push_back(Point(prevX, prevY));

                polygon.push_back(Point(prevX, topY));

                polyMap_.push_back(polygon);

                polygon.clear();

                polygon.push_back(Point(-prevX, topY));

                polygon.push_back(Point(-prevX, prevY));

                polygon.push_back(Point(-x, y));

                polygon.push_back(Point(-x, topY));

                polyMap_.push_back(polygon);

            }

            else

            {

                polygon.push_back(Point(prevX, -topY));

                polygon.push_back(Point(prevX, -prevY));

                polygon.push_back(Point(x, -y));

                polygon.push_back(Point(x, -topY));

                polyMap_.push_back(polygon);

                polygon.clear();

                polygon.push_back(Point(-x, -topY));

                polygon.push_back(Point(-x, -y));

                polygon.push_back(Point(-prevX, -prevY));

                polygon.push_back(Point(-prevX, -topY));

                polyMap_.push_back(polygon);

            }

            ++pos;

            prevX = x;

            prevY = y;

        }

    }

}

 

void HourglassModel::setState(double state)

{

    isSand_ = (state > 1.0);

    if (isSand_)

        state -= 1.0;

    interY_ = height_ * state;

    build();

}

 

const PolygonMap& HourglassModel::getPolygonMap() const

{

    return polyMap_;

}

 

2.2. Объект сцены

 

Листинг 2.3. Файл Scene.h

 

#ifndef SCENE_HEADER

#define SCENE_HEADER

 

#include <vector>

 

#include "IModel.h"

 

class Scene

{

private:

    std::vector<IModel*> models_; // список моделей сцены

    double angle_; // угол поворота изображения

    unsigned int state_; // текущее состояние сцены

    unsigned int speed_; // скорость (количество пропускаемых кадров)

    bool isPaused_; // признак приостановки

    bool isSand_; // признак материала (вода или песок)

public:

    Scene();

    unsigned int count(); // количество моделей

    // возвращает модель с указанным индексом

    const IModel& operator [](unsigned int index);

    void synchronize(); // переход к следующему состоянию (такт автомата)

    void setSand(bool isSand = true); // установка признака материала

    bool pause(); // приостановка сцены

    bool increaseSpeed(); // увеличение скорости

    bool decreaseSpeed(); // уменьшение скорости

    bool isPaused(); // возвращает признак приостановки

    double getAngle(); // возвращает угол поворота

    unsigned int getSpeed(); // возвращает скорость

    void setSpeed(unsigned int speed); // устанавливает скорость

    ~Scene();

};

 

#endif // SCENE_HEADER

 

Листинг 2.4. Файл Scene.cpp

 

#include "Scene.h"

#include "HourglassModel.h"

#include "StandModel.h"

#include "WaterlineModel.h"

 

Scene::Scene() : angle_(0.0), state_(0), speed_(5), isPaused_(false),

    isSand_(false)

{

    models_.push_back(new HourglassModel(2.0, 3.2));

    models_.push_back(new HourglassModel(2.0, 3.2, true));

    models_.push_back(new WaterlineModel(3.2, 3.2));

    models_.back()->setColor(Color(0, 127, 255));

    models_.push_back(new HourglassModel(2.0, 3.2, false, 0.0));

    models_.back()->setColor(Color(0, 127, 255));

    models_.push_back(new HourglassModel(2.0, 3.2, true, 3.2));

Информация о работе Цветное движущееся изображение: песочные часы