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

Автор работы: Пользователь скрыл имя, 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 Кб (Скачать файл)

                         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(QPointF(yMargin, step), QSize(outline, outline)),

                         QString::number(label, 'f', 2),

                         QTextOption(Qt::AlignCenter));

    }

 

    /////////////////////////////////////

    // Отображение подписей трассировки.

    /////////////////////////////////////

 

    if (tracerOk)

    {

        painter.drawText(QRectF(QPointF(realTraceX + halfSide, 0), QSize(outline, outline)),

                         QString::number(traceX, 'f', 2),

                         QTextOption(Qt::AlignCenter));

        painter.drawText(QRectF(QPointF(viewportSize.width() + outline, realTraceY + halfSide), QSize(outline, outline)),

                         QString::number(traceY, 'f', 2),

                         QTextOption(Qt::AlignCenter));

    }

}

 

// Отслеживание мыши.

void Graph::mouseMoveEvent(QMouseEvent * event)

{

    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::SetTracingFunctionByIndex(int i)

{

    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::DialogAddFunction(QWidget *parent) :

    QDialog(parent),

    ui(new Ui::DialogAddFunction)

{

    ui->setupUi(this);

    setLayout(ui->mainLayout);

 

    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));

    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::~DialogAddFunction()

{

    delete ui;

}

 

// Изменение цвета метки диалога.

void DialogAddFunction::changeColor()

{

    QPalette palette;

    palette.setColor(QPalette::Background, color);

    ui->lblColor->setPalette(palette);

}

 

// Задание цвета диалогом.

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::DialogSettings(qreal xMin, qreal xMax, qreal yMin, qreal yMax,

                               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->tabLayout);

    ui->tab_2->setLayout(ui->tab2Layout);

 

    ui->dblspnXmin->setValue(xMin);

    ui->dblspnXmax->setValue(xMax);

    ui->dblspnYmin->setValue(yMin);

    ui->dblspnYmax->setValue(yMax);

    ui->spnOutline->setValue(outline);

    ui->spnGridStep->setValue(gridStep);

 

    this->gridColor = gridColor;

    this->background = background;

    this->textColor = textColor;

 

    QPalette palette1;

    palette1.setColor(QPalette::Background, background);

    ui->lblBackgroundColor->setPalette(palette1);

 

    QPalette palette2;

    palette2.setColor(QPalette::Background, gridColor);

    ui->lblGridColor->setPalette(palette2);

 

    QPalette palette3;

    palette3.setColor(QPalette::Background, textColor);

    ui->lblTextColor->setPalette(palette3);

 

    connect(ui->btnOk,      SIGNAL(clicked()), SLOT(check()));

    connect(ui->btnCancel,  SIGNAL(clicked()), SLOT(reject()));

}

 

DialogSettings::~DialogSettings()

{

    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(QLabel * label, QColor color)

{

    QPalette palette;

    palette.setColor(QPalette::Background, color);

    label->setPalette(palette);

}

 

////////////////////////////

// Задание цветов диалогом.

////////////////////////////

 

void DialogSettings::on_btnBackgroundColor_clicked()

{

    QColor newColor = QColorDialog::getColor(background, this, tr("Задание цвета фона"));

    if (!newColor.isValid()) return;

    background = newColor;

    setColor(ui->lblBackgroundColor, background);

}

 

void DialogSettings::on_btnGridColor_clicked()

{

    QColor newColor = QColorDialog::getColor(gridColor, this, tr("Задание цвета сетки"));

    if (!newColor.isValid()) return;

    gridColor = newColor;

    setColor(ui->lblGridColor, gridColor);

}

 

void DialogSettings::on_btnTextColor_clicked()

{

    QColor newColor = QColorDialog::getColor(textColor, this, tr("Задание цвета текста"));

    if (!newColor.isValid()) return;

    textColor = newColor;

    setColor(ui->lblTextColor, textColor);

}

 

dialogaddpoint.cpp

#include "dialogaddpoint.h"

#include "ui_dialogaddpoint.h"

 

DialogAddPoint::DialogAddPoint(QWidget *parent) :

    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::~DialogAddPoint()

{

    delete ui;

}

 

// Подтверждение.

void DialogAddPoint::check()

{

    x = ui->X->value();

    y = ui->Y->value();

    accept();

}

 

 


 



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