Автор работы: Пользователь скрыл имя, 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
QString::number(label, 'f', 2),
QTextOption(Qt::AlignCenter));
}
for(int i(0); i <= yStepCount; ++i)
{
qreal label (top + i * yGraphStep / scale),
step (halfSide + i * yViewportStep);
painter.drawText(QRectF(QPoint
QString::number(label, 'f', 2),
QTextOption(Qt::AlignCenter));
}
//////////////////////////////
// Отображение подписей трассировки.
//////////////////////////////
if (tracerOk)
{
painter.drawText(QRectF(QPoint
QString::number(traceX, 'f', 2),
QTextOption(Qt::AlignCenter));
painter.drawText(QRectF(QPoint
QString::number(traceY, 'f', 2),
QTextOption(Qt::AlignCenter));
}
}
// Отслеживание мыши.
void Graph::mouseMoveEvent(QMouseEv
{
if (!tracing) return;
// Процентное положение мыши.
qreal percentX((event->pos().x() - outline) / qreal(viewportSize.width()));
if (percentX < 0.0) percentX = 0.0;
else if (percentX > 1.0) percentX = 1.0;
mouseX = percentX * graphSize.width() / scale + left;
tracerOk = tracing->has(mouseX);
if (tracerOk)
{
traceX = mouseX;
traceY = tracing->value(mouseX);
realTraceX = percentX * viewport.width();
realTraceY = (traceY - bottom) / qreal(graphSize.height() / scale) *
viewport.height() + viewport.height() / viewport.height() + viewport.height();
}
if (traceY < bottom || traceY > top) tracerOk = false;
paintGL();
}
// Задание траасируемой функции по индексу.
void Graph::
{
if (i < 0 || i >= functions->count())
{
tracerOk = false;
tracing = NULL;
return;
}
tracing = &functions->at(i);
tracerOk = false;
showTracing = true;
paintGL();
paintGL();
}
function.cpp
#include "function.h"
Function::Function(QString name, QColor color, QPointF first, QPointF last)
{
this->name = name;
this->color = color;
addPoint(first);
addPoint(last);
}
// Добавление точки с сохранением сортировка по x.
int Function::addPoint(QPointF point)
{
QListIterator<QPointF> i(points);
int counter(0);
while(i.hasNext())
{
QPointF temp(i.next());
if (temp.x() == point.x()) return -1;
if (temp.x() > point.x())
{
points.insert(counter, point);
xMin = points.first().x();
xMax = points.last().x();
return counter;
}
++counter;
}
points.append(point);
xMin = points.first().x();
xMax = points.last().x();
return counter;
}
// Значение функции в заданной точке.
qreal Function::value(qreal arg) const
{
QPointF point1, point2; // Соседние точки из заданных.
QListIterator<QPointF> i(points); // Точка, что меньше.
while(i.hasNext())
{
QPointF temp(i.next());
if (temp.x() == arg) return temp.y();
if (temp.x() > arg) break;
point1 = temp;
}
QListIterator<QPointF> j(points); // Точка, что больше.
j.toBack();
while(j.hasPrevious())
{
QPointF temp(j.previous());
if (temp.x() <= arg) break;
point2 = temp;
}
// Линейная апроксимация.
return point1.y() +
(point2.y() - point1.y()) /
(point2.x() - point1.x()) *
(arg - point1.x());
}
dialogaddfunction.cpp
#include "dialogaddfunction.h"
#include "ui_dialogaddfunction.h"
DialogAddFunction::
QDialog(parent),
ui(new Ui::DialogAddFunction)
{
ui->setupUi(this);
setLayout(ui->mainLayout);
qsrand(QTime(0,0,0).secsTo(QTi
color = QColor(qrand() % 255, qrand() % 255, qrand() % 255);
changeColor();
connect(ui->btnOk, SIGNAL(clicked()), SLOT(check()));
connect(ui->btnCancel, SIGNAL(clicked()), SLOT(reject()));
connect(ui->btnColor, SIGNAL(clicked()), SLOT(setColor()));
}
DialogAddFunction::~DialogAddF
{
delete ui;
}
// Изменение цвета метки диалога.
void DialogAddFunction::
{
QPalette palette;
palette.setColor(QPalette::Bac
ui->lblColor->setPalette(
}
// Задание цвета диалогом.
void DialogAddFunction::setColor()
{
QColor newColor = QColorDialog::getColor(color, this, tr("Задание цвета графика функции"));
if (!newColor.isValid()) return;
color = newColor;
changeColor();
}
// Подтверждение.
void DialogAddFunction::check()
{
if (ui->dblspnX1->value() == ui->dblspnX2->value())
{
QMessageBox::warning(0, tr("Невозможно создать функцию"), tr("Каждому x должен соответстовать только один y"));
return;
}
name = ui->txtName->text();
x1 = ui->dblspnX1->value();
x2 = ui->dblspnX2->value();
y1 = ui->dblspnY1->value();
y2 = ui->dblspnY2->value();
accept();
}
dialogsettings.cpp
#include "dialogsettings.h"
#include "ui_dialogsettings.h"
DialogSettings::
int outline, int gridStep,
QColor gridColor, QColor background, QColor textColor,
QWidget *parent) :
QDialog(parent),
ui(new Ui::DialogSettings)
{
ui->setupUi(this);
setLayout(ui->mainLayout);
ui->tab->setLayout(ui->tabLayo
ui->tab_2->setLayout(ui->tab2L
ui->dblspnXmin->setValue(xMin)
ui->dblspnXmax->setValue(xMax)
ui->dblspnYmin->setValue(yMin)
ui->dblspnYmax->setValue(yMax)
ui->spnOutline->setValue(
ui->spnGridStep->setValue(
this->gridColor = gridColor;
this->background = background;
this->textColor = textColor;
QPalette palette1;
palette1.setColor(QPalette::Ba
ui->lblBackgroundColor->
QPalette palette2;
palette2.setColor(QPalette::Ba
ui->lblGridColor->setPalette(
QPalette palette3;
palette3.setColor(QPalette::Ba
ui->lblTextColor->setPalette(
connect(ui->btnOk, SIGNAL(clicked()), SLOT(check()));
connect(ui->btnCancel, SIGNAL(clicked()), SLOT(reject()));
}
DialogSettings::~DialogSetting
{
delete ui;
}
// Подтверждение.
void DialogSettings::check()
{
xMin = ui->dblspnXmin->value();
xMax = ui->dblspnXmax->value();
if (xMin > xMax) qSwap(xMin, xMax);
if (xMin == xMax)
{
QMessageBox::warning(0, tr("Ошибка"), tr("Правая и левая границы графика не должны совпадать!"));
return;
}
yMin = ui->dblspnYmin->value();
yMax = ui->dblspnYmax->value();
if (yMax > yMin) qSwap(yMax, yMin);
if (yMin == yMax)
{
QMessageBox::warning(0, tr("Ошибка"), tr("Верхняя и нижняя границы графика не должны совпадать!"));
return;
}
outline = ui->spnOutline->value();
gridStep = ui->spnGridStep->value();
accept();
}
// Изменение цвета метки.
void DialogSettings::setColor(QLabe
{
QPalette palette;
palette.setColor(QPalette::Bac
label->setPalette(palette);
}
////////////////////////////
// Задание цветов диалогом.
////////////////////////////
void DialogSettings::on_
{
QColor newColor = QColorDialog::getColor(backgro
if (!newColor.isValid()) return;
background = newColor;
setColor(ui->lblBackgroundColo
}
void DialogSettings::on_
{
QColor newColor = QColorDialog::getColor(gridCol
if (!newColor.isValid()) return;
gridColor = newColor;
setColor(ui->lblGridColor, gridColor);
}
void DialogSettings::on_
{
QColor newColor = QColorDialog::getColor(textCol
if (!newColor.isValid()) return;
textColor = newColor;
setColor(ui->lblTextColor, textColor);
}
dialogaddpoint.cpp
#include "dialogaddpoint.h"
#include "ui_dialogaddpoint.h"
DialogAddPoint::
QDialog(parent),
ui(new Ui::DialogAddPoint)
{
ui->setupUi(this);
setLayout(ui->mainLayout);
connect(ui->OK, SIGNAL(clicked()), SLOT(check()));
connect(ui->Cancel, SIGNAL(clicked()), SLOT(reject()));
}
DialogAddPoint::~DialogAddPoin
{
delete ui;
}
// Подтверждение.
void DialogAddPoint::check()
{
x = ui->X->value();
y = ui->Y->value();
accept();
}
Информация о работе Построение графика функции по заданным точкам