Построение графика функции по заданным точкам

Автор работы: Пользователь скрыл имя, 04 Ноября 2014 в 17:33, курсовая работа

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

Цель данной курсовой работы –разработка приложения, позволяющего построить график функции по заданным точкам.
В данном приложение реализуется программное построение графика данной функции. Очень удобным на практике является тот факт, что график строится по заданным точкам. Это актуально в случаях, когда график в силу каких-либо причин невозможно задать уравнением.
При выполнении данной курсовой работы были поставлены следующие задачи:
• Изучение методов построения графиков и их анализ;
• Выбор среды разработки;
• Изучение методов реализации приложения в выбранной среде;
• Разработать приложение, позволяющее строить график по заданным точкам.

Содержание

ВВЕДЕНИЕ 3
1. КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ 4
1.1 ОСНОВНЫЕ ПОНЯТИЯ 4
1.2 СПОСОБЫ ЗАДАНИЯ ФУНКЦИИ 5
1.3 СРЕДСТВА СОЗДАНИЯ ГРАФИЧЕСКОГО ИНТЕРФЕЙСА 6
1.4 СРАВНЕНИЕ OPENGL И DIRECTX 15
2. ОПИСАНИЕ ПРИЛОЖЕНИЯ 18
2.1 ОПИСАНИЕ ИСХОДНОГО КОДА 18
2.2 ИНТЕРФЕЙС ПРИЛОЖЕНИЯ 19
ТЕСТИРОВАНИЕ РАБОТЫ ПРИЛОЖЕНИЯ НА ПРИМЕРЕ 23
ЗАКЛЮЧЕНИЕ 27
СПИСОК ЛИТЕРАТУРЫ 28
ПРИЛОЖЕНИЕ А 29

Вложенные файлы: 1 файл

Kursovaya_Elvira.docx

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

Отличительная особенность Qt от других библиотек — использование Meta Object Compiler (MOC) — предварительной системы обработки исходного кода (в общем-то, Qt — это библиотека не для чистого C++, а для его особого наречия, с которого и «переводит» MOC для последующей компиляции любым стандартным C++ компилятором). MOC позволяет во много раз увеличить мощь библиотек, вводя такие понятия, как слоты и сигналы. Кроме того, это позволяет сделать код более лаконичным. Утилита MOC ищет в заголовочных файлах на C++ описания классов, содержащие макрос Q_OBJECT, и создаёт дополнительный исходный файл на C++, содержащий метаобъектный код.

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

Qt комплектуется визуальной  средой разработки графического  интерфейса «Qt Designer», позволяющей создавать диалоги и формы в режиме WYSIWYG. В поставке Qt есть «Qt Linguist» — графическая утилита, позволяющая упростить локализацию и перевод программы на многие языки; и «Qt Assistant» — справочная система Qt, упрощающая работу с документацией по библиотеке, а также позволяющая создавать кросс-платформенную справку для разрабатываемого на основе Qt ПО. Начиная с версии 4.5.0 в комплект Qt включена среда разработки «Qt Creator», которая включает в себя редактор кода, справку, графические средства «Qt Designer» и возможность отладки приложений. «Qt Creator» может использовать GCC или Microsoft VC++ в качестве компилятора и GDB в качестве отладчика. Для Windows версий библиотека комплектуется компилятором, заголовочными и объектными файлами MinGW.

 

 

  1. Описание приложения

    1. Описание исходного кода

Приложение разработано на языке C++ в среде Qt. Вывод графиков реализуется с помощью класса QGlWidget, основанного на графической библиотеке OpenGl.

Классы, разработанные в приложении:

    • Mainwindow – класс главного окна, наследуемый от стандартного класса Qt QMainWindow
    • Graph - Класс графика. Позволяет отображать графики нескольких функций в одной системе координат. Хранит список функций и параметры графика.
    • Function - Класс функции. Позволяет создавать функцию на базе двух точек. Хранит список точек функции, её цвет и имя.
    • Widgets -  Класс для отображения списка функций.
    • Dialogaddfunction - Диалог добавления новой функции. Позволяет задавать имя функции, цвет и две крайние точки.
    • Dialogsettings - Диалог настроек графика. Позволяет задавать границы графика и его оформление.
    • Dialogaddpoint - Диалог добавления новой точки. Позволяет задавать координаты точки.

Основные функции:

int Function::addPoint(QPointF point) - Добавление точки с сохранением сортировка по x.

qreal Function::value(qreal arg) const - Значение функции в заданной точке.

void Graph::paintGL() - Перерисовка графика.

void Graph::mouseMoveEvent(QMouseEvent * event) - Отслеживание мыши.

void Graph::SetTracingFunctionByIndex(int i) - Задание трассируемой функции по индексу.

Возможности приложения:

  • Добавление функции;
  • Удаление функции;
  • Сохранение и загрузка функции;
  • Переименование функции;
  • Изменение цвета графика функции;
  • Сохранение графика в файл;
  • Изменение цвета фона графика;
  • Изменение цвета текста;
  • Изменение шага;
  • Изменение шага сетки;
  • Изменение границ графика;
  • Добавление и удаление точки.

 

    1. Интерфейс приложения

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

Рис. 1. Главное окно

  1. Тестирование работы приложения на примере

 

Рис. 2. Переименование функции

Рис. 3. Добавление точки

Рис. 4. Добавление функции

Рис. 5. Задание цвета фона

Рис. 6. Добавление точки

 

 

Рис. 7. Настройки графика

Рис. 8. Настройки оформления

 

 

 

Заключение

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

 

Список использованных источников

  1. Бланшет Ж., Саммерфилд М. Qt 4. Программирование GUI на C++ = C++ GUI Programmingwith Qt 4. — М.: КУДИЦ-Пресс, 2008. — 736 с.
  2. М. Эллис, Б. Строуструп. Справочное руководство по языку C++ с комментариями: Пер. с англ. - Москва: Мир, 1992. 445с.
  3. Стенли Б. Липпман. C++ для начинающих: Пер. с англ. 2тт. - Москва: Унитех; Рязань: Гэлион, 1992, 304-345сс.
  4. Бруно Бабэ. Просто и ясно о Borland C++: Пер. с англ. - Москва: БИНОМ, 1994. 400с.
  5. В.В. Подбельский. Язык C++: Учебное пособие. - Москва: Финансы и статистика, 1995. 560с.
  6. Ирэ Пол. Объектно-ориентированное программирование с использованием C++: Пер. с англ. - Киев: НИИПФ ДиаСофт Лтд, 1995. 480с.
  7. Макс Шлее. Qt 4.8. Профессиональное программирование на C++ = Qt 4.8 Professional programming with C++. — СПб.: БХВ-Петербург, 2012. — 894 с.

 

 

 

 

Приложение А

Заголовочные файлы:

mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

 

#include <QMainWindow>

#include <QPushButton>

#include <QMenu>

#include <QLabel>

#include <QPushButton>

#include <QInputDialog>

#include <QMessageBox>

#include <QColorDialog>

#include <QFileDialog>

#include <QTextStream>

 

#include <qmath.h>

 

#include "dialogaddfunction.h"

#include "dialogsettings.h"

#include "dialogaddpoint.h"

#include "function.h"

#include "graph.h"

#include "widgets.h"

 

namespace Ui

{

class MainWindow;

}

 

// Класс главного окна.

class MainWindow : public QMainWindow

{

    Q_OBJECT

 

    Ui::MainWindow *ui;

 

    Graph * graph;          // График.

    Functions functions;    // Функции.

 

    FunctionsWidget * functionsWidget;  // Отображение списка функий.

    PointsWidget    * pointsWidget;     // Отображени таблицы координат точек.

 

    PointsModel     * pointsModel;      // Модель таблицы точек.

 

    QMenu   * functionsContextMenu, // Контекстные меню.

            * graphContextMenu,

            * pointsContextMenu;

 

    QAction * saveFunction,         // Элементы меню.

            * renameFunction,

            * changeColorFunction,

            * deleteFunction,

            * addPoint,

            * deletePoint;

 

public:

    explicit MainWindow(QWidget *parent = 0);

    ~MainWindow();

 

public slots:

    void graphContext()     {graphContextMenu->exec(QCursor::pos());}       // Вызов контестного меню графика.

    void functionsContext() {functionsContextMenu->exec(QCursor::pos());}   // Вызов контестного меню списка функций.

    void pointContext()     {pointsContextMenu->exec(QCursor::pos());}      // Вызов контекстного меню таблицы точек.

 

    void settings();    // Настройки.

    void snapShot();    // Сохранить изображение.

 

    void RenameFunction();      // Переименовать функцию.

    void DeleteFunction();      // Удалить функцию.

    void ChangeColorFunction(); // Изменить цвет функции.

    void AddFunction();         // Добавить функцию.

    void SaveFunction();        // Сохранить функцию.

    void LoadFunction();        // Загрузить функцию.

 

    void AddPoint();    // Добавить точку.

    void DeletePoint(); // Удалить точку.

 

    void UpdatePointWidget(int row); // Переключить отображение точек на выбранную функцию.

};

 

#endif // MAINWINDOW_H

 

graph.h

#ifndef GRAPH_H

#define GRAPH_H

 

#include <QGLWidget>

#include <QMouseEvent>

 

#include "function.h"

 

// Класс графика.

// Позволяет отображать графики нескольких функций в одной системе координат.

// Хранит список функций и параметры графика.

class Graph : public QGLWidget

{

    Q_OBJECT

 

    qreal   xGraphStep, yGraphStep,         // Шаг сетки графика.

            xViewportStep, yViewportStep,   // Шаг сетки графика в реальных координатах.

            mouseX, mouseY,                 // Координаты мыши в виртуальных координатах.

            traceX, traceY,                 // Результат трасировки в виртуальных координатах.

            realTraceX, realTraceY;         // Результат трасировки в реальных координатах.

    int     xStepCount, yStepCount;         // Количество шагов.

    Functions * functions;                  // Отображаемые функции.

    const Function * tracing;               // Трассируемая функция.

    QSize graphSize, viewportSize;          // Размер графика и виджета.

    QRect   graph, viewport;                // Прямоугольная область графика и виджета.

 

public:

    qreal   left, right, top, bottom,   // Размеры графика.

            scale;                      // Масштаб графика (для вмещения дробной части в целочисленных координатах).

    int     outline,                    // Отступ границы графика.

            gridStep;                   // Шаг автосетки.

 

    // Внешний вид графика.

    QPen    gridPen;            // Линии сетки.

    QBrush  backgroundBrush;    // Цвет фона.

    QFont   labelFont;          // Шрифт подписей.

    QColor  textColor;          // Цвет текста.

 

    bool tracerOk, showTracing; // Отображение трассировки.

 

    explicit Graph(Functions * functions, QWidget *parent = 0);

   

    void resizeGL(int w = 0, int h = 0);    // Перерисовка графика, при изменении размера виджета.

    void paintGL();                         // Перерисовка графика.

 

    void mouseMoveEvent(QMouseEvent * event);    // Отслеживание мыши.

 

public slots:

    void SetTracingFunctionByIndex(int i);  // Задание траасируемой функции по индексу.

    void redraw() {paintGL();}              // Переотрисовка.

};

 

#endif // GRAPH_H

 

function.h

#ifndef FUNCTION_H

#define FUNCTION_H

 

#include <QList>

#include <QPointF>

#include <QString>

#include <QColor>

 

// Класс функции.

// Позволяет создавать функцию на базе двух точек.

// Хранит список точек функции, её цвет и имя.

class Function

{

public:

    qreal xMin, xMax;   // Область определения функции.

 

    typedef QList<QPointF> Points;  // Список точек

 

    QString name;   // Имя функции.

    QColor color;   // Цвет функции.

    Points points;  // Список точек.

 

    Function(QString name, QColor color, QPointF first, QPointF last);

 

    bool has(qreal arg) const {return (arg >= xMin) && (arg <= xMax);}  // Входит ли x в область определения.

 

    int addPoint(QPointF point);    // Добавить точку (поддреживая порядок возрастания по x).

    qreal value(qreal arg) const;   // f(x)

};

 

typedef QList<Function> Functions;

 

#endif // FUNCTION_H

 

widgets.h

#ifndef WIDGETS_H

#define WIDGETS_H

 

#include <QListWidget>

#include <QList>

#include <QDoubleSpinBox>

#include <QItemDelegate>

#include <QTableView>

#include <QMessageBox>

 

#include "function.h"

 

// Класс для отображения списка функций.

class FunctionsWidget : public QListWidget

{

    Q_OBJECT

 

public:

    explicit FunctionsWidget(Functions * functions, QWidget *parent = 0) :

        QListWidget(parent)

    {

        // Заполнение виджета.

        QListIterator<Function> i(*functions);

        int index(0);

        while (i.hasNext())

        {

            const Function & function(i.next());

            QListWidgetItem * item = new QListWidgetItem(function.name);

            item->setTextColor(function.color);

            insertItem(++index, item);

        }

        setContextMenuPolicy(Qt::CustomContextMenu);

    }

 

    // Позволяет получить индекс выбранной строки.

    int selectedRow() const

    {

        if (selectedIndexes().isEmpty()) return -1;

        return selectedIndexes().takeFirst().row();

    }

};

 

// Класс делегата, для редактирования элемента таблицы точек.

class Delegate : public QItemDelegate

{

public:

    Delegate() {}

 

    // Создание объекта-редактора.

    QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const

    {

        QDoubleSpinBox * editor = new QDoubleSpinBox(parent);

            editor->setDecimals(2);

            editor->setMaximum(99);

            editor->setMinimum(-99);

        return editor;

    }

    // Заполнение объекта-редактора из модели.

    void setEditorData(QWidget *editor, const QModelIndex &index) const

    {

        QDoubleSpinBox * myEditor = qobject_cast<QDoubleSpinBox *>(editor);

        if (myEditor)

        {

            QString text = index.model()->data(index, Qt::EditRole).toString();

            qreal value = text.toDouble();

            myEditor->setValue(value);

        }

    }

    // Запись данных в модель из объекта-редактора.

    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const

    {

        QDoubleSpinBox * myEditor = qobject_cast<QDoubleSpinBox *>(editor);

        if (myEditor)

            model->setData(index, myEditor->value());

    }

};

 

 

// Класс элемента табличной модели для модели таблицы точек.

class Item

{

public:

    QString x, y;

    Item(qreal x, qreal y)

    {

        this->x = QString::number(x, 'f', 2);

        this->y = QString::number(y, 'f', 2);

    }

};

 

// Класс табличной модели для виджета отображения таблицы точек.

class PointsModel : public QAbstractTableModel

{

    Q_OBJECT

 

    QList<Item *>   points;

    Function      * function;

    QStringList     headers;

    int             countOfPoints;

 

public:

    explicit PointsModel(Function * func, QObject *parent = 0):

        QAbstractTableModel(parent)

    {

        headers << "x" << "y";

        function = func;

        QListIterator<QPointF> i(function->points);

        while (i.hasNext())

        {

            QPointF pos(i.next());

            Item * point = new Item(pos.x(), pos.y());

            points.append(point);

        }

        countOfPoints = function->points.count();

    }

    // Выдача данных модели виджету представлению.

    QVariant data(const QModelIndex & index, int role) const

    {

        if (role == Qt::DisplayRole || role == Qt::EditRole)

        {

            switch (index.column())

            {

                case 0:     return points.at(index.row())->x;

                case 1:     return points.at(index.row())->y;

                default:    return QVariant();

            }

        }

        return QVariant();

    }

    // Запись данных полученных от виджета представления.

    bool setData (const QModelIndex & index, const QVariant & value, int role)

Информация о работе Построение графика функции по заданным точкам