Автор работы: Пользователь скрыл имя, 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
Отличительная особенность Qt от других библиотек — использование Meta Object Compiler (MOC) — предварительной системы обработки исходного кода (в общем-то, Qt — это библиотека не для чистого C++, а для его особого наречия, с которого и «переводит» MOC для последующей компиляции любым стандартным C++ компилятором). MOC позволяет во много раз увеличить мощь библиотек, вводя такие понятия, как слоты и сигналы. Кроме того, это позволяет сделать код более лаконичным. Утилита MOC ищет в заголовочных файлах на C++ описания классов, содержащие макрос Q_OBJECT, и создаёт дополнительный исходный файл на C++, содержащий метаобъектный код.
Qt позволяет создавать
собственные плагины и
Qt комплектуется визуальной
средой разработки
Приложение разработано на языке C++ в среде Qt. Вывод графиков реализуется с помощью класса QGlWidget, основанного на графической библиотеке OpenGl.
Классы, разработанные в приложении:
Основные функции:
int Function::addPoint(QPointF point) - Добавление точки с сохранением сортировка по x.
qreal Function::value(qreal arg) const - Значение функции в заданной точке.
void Graph::paintGL() - Перерисовка графика.
void Graph::mouseMoveEvent(QMouseEv
void Graph::
Возможности приложения:
Интерфейс приложения состоит из главного окна, которое содержит перечень заданных функций, таблицу с координатами точек этих функций, панель управления, позволяющую редактировать функции и график и сам график.
Рис. 1. Главное окно
Рис. 2. Переименование функции
Рис. 3. Добавление точки
Рис. 4. Добавление функции
Рис. 5. Задание цвета фона
Рис. 6. Добавление точки
Рис. 7. Настройки графика
Рис. 8. Настройки оформления
При выполнении данной работы были изучены методы построения графиков и их анализ, изучены методы реализации приложения в среде Qt Creator, а также разработано приложение, позволяющее строить график по заданным точкам. Приложение обладает удобный, интуитивно понятным интерфейсом.
Список использованных источников
Заголовочные файлы:
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(QCurso
void functionsContext() {functionsContextMenu->exec(QC
void pointContext() {pointsContextMenu->exec(QCurs
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.co
insertItem(++index, item);
}
setContextMenuPolicy(Qt::Custo
}
// Позволяет получить индекс выбранной строки.
int selectedRow() const
{
if (selectedIndexes().isEmpty()) return -1;
return selectedIndexes().takeFirst().
}
};
// Класс делегата, для редактирования элемента таблицы точек.
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)
Информация о работе Построение графика функции по заданным точкам