-
Notifications
You must be signed in to change notification settings - Fork 14
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
17 changed files
with
8,958 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
cmake_minimum_required(VERSION 3.5) | ||
|
||
project(07_GraphicsCharts VERSION 0.1 LANGUAGES CXX) | ||
|
||
set(CMAKE_INCLUDE_CURRENT_DIR ON) | ||
|
||
set(CMAKE_AUTOUIC ON) | ||
set(CMAKE_AUTOMOC ON) | ||
set(CMAKE_AUTORCC ON) | ||
|
||
set(CMAKE_CXX_STANDARD 17) | ||
set(CMAKE_CXX_STANDARD_REQUIRED ON) | ||
|
||
|
||
find_package(Qt6 COMPONENTS Widgets Charts REQUIRED) | ||
|
||
set(PROJECT_SOURCES | ||
main.cpp | ||
mainwindow.cpp | ||
mainwindow.h | ||
mainwindow.ui | ||
graphicchart.cpp | ||
graphicchart.h | ||
#qcustomplot.cpp | ||
#qcustomplot.h | ||
#graphic.cpp | ||
#graphic.h | ||
) | ||
|
||
qt_add_executable(07_GraphicsCharts | ||
MANUAL_FINALIZATION | ||
${PROJECT_SOURCES} | ||
) | ||
|
||
|
||
target_link_libraries(07_GraphicsCharts PRIVATE Qt6::Widgets | ||
Qt6::Charts) | ||
|
||
qt_finalize_executable(07_GraphicsCharts) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
#include "graphicchart.h" | ||
|
||
GraphicChart::GraphicChart(uint32_t numberGr) | ||
{ | ||
//В конструктор необходимо передать сколько серий графиков будет использоваться. Серия это один график, | ||
//в одних осях может быть несколько графиков, например для сравнения. | ||
|
||
//Примем количество графиков и ресайзнем вектор. | ||
numGraphs = numberGr; | ||
ptrGraph.resize(numGraphs); | ||
|
||
//Создадим объекты серий | ||
for(int i = 0; i<numGraphs; i++){ | ||
ptrGraph[i] = new QLineSeries(this); | ||
} | ||
|
||
} | ||
|
||
/*! | ||
* \brief Метод добавляет данные на график. | ||
* \param x - данные по оси Х | ||
* \param y - по оси У | ||
* \param numGraph - количество графиков | ||
*/ | ||
void GraphicChart::AddDataToGrahp(QVector<double> x, QVector<double> y, uint32_t numGraph) | ||
{ | ||
|
||
//Зададим размер графика, т.е. количество точек. | ||
uint32_t size = 0; | ||
//Необходимо, чтобы х и у были равны. | ||
if(x.size() >= y.size()){ | ||
size = y.size(); | ||
} | ||
else{ | ||
size = x.size(); | ||
} | ||
|
||
//Добавление точе в серию осуществляется при помощи метода append. | ||
for(int j = 0; j<size; j++){ | ||
ptrGraph[numGraph]->append(x[j],y[j]); | ||
} | ||
} | ||
/*! | ||
* \brief Метод очищает данные на графике | ||
* \param chart - указатель на график | ||
*/ | ||
void GraphicChart::ClearGraph(QChart *chart) | ||
{ | ||
//Необходимо очистить все графики | ||
for(int i = 0; i<numGraphs; i++){ | ||
//Очищаем серии | ||
ptrGraph[i]->clear(); | ||
//Удаляем серии из графика | ||
chart->removeSeries(ptrGraph[i]); | ||
} | ||
} | ||
|
||
/*! | ||
* \brief Метод добавляет серии к графику | ||
* \param chart - указатель на график | ||
*/ | ||
void GraphicChart::UpdateGraph(QChart *chart) | ||
{ | ||
for(int i = 0; i<numGraphs; i++){ | ||
chart->addSeries(ptrGraph[i]); | ||
} | ||
|
||
} | ||
|
||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
#ifndef GRAPHICCHART_H | ||
#define GRAPHICCHART_H | ||
|
||
#include <QObject> | ||
#include <QLineSeries> | ||
#include <QtCharts> | ||
#include <QChartView> | ||
|
||
#define FIRST_GRAPH 0 | ||
|
||
class GraphicChart : public QObject | ||
{ | ||
Q_OBJECT | ||
public: | ||
GraphicChart(uint32_t numberGr = 0); | ||
|
||
void AddDataToGrahp(QVector<double> x, QVector<double> y, uint32_t numGraph); | ||
void ClearGraph(QChart* chart); | ||
void UpdateGraph(QChart* chart); | ||
|
||
|
||
signals: | ||
|
||
private: | ||
|
||
QList<QLineSeries*> ptrGraph; | ||
uint32_t numGraphs = 0; | ||
|
||
|
||
}; | ||
|
||
#endif // GRAPHICCHART_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
#include "mainwindow.h" | ||
|
||
#include <QApplication> | ||
|
||
int main(int argc, char *argv[]) | ||
{ | ||
QApplication a(argc, argv); | ||
MainWindow w; | ||
|
||
w.show(); | ||
return a.exec(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,223 @@ | ||
#include "mainwindow.h" | ||
#include "./ui_mainwindow.h" | ||
|
||
MainWindow::MainWindow(QWidget *parent) | ||
: QMainWindow(parent) | ||
, ui(new Ui::MainWindow) | ||
{ | ||
ui->setupUi(this); | ||
ui->rb_cos->setChecked(true); | ||
|
||
|
||
//Выделим память под наши объекты. | ||
|
||
//Объект QChart является основным, в котором хранятся все данные графиков и который отвечает | ||
//за само поле отображения графика, управляет осями, легенодой и прочими атрибутами графика. | ||
chart = new QChart( ); | ||
chart->legend()->setVisible(false); | ||
//Объект QChartView является виджетом отображальщиком графика. В его конструктор необходимо передать ссылку | ||
//на объект QChart. | ||
chartView = new QChartView(chart); | ||
//И создадим объект нашего класса. | ||
graphClass = new GraphicChart(NUM_GRAPHS); | ||
//chart -> chartVuiew -> данные для отображения | ||
|
||
|
||
layout = new QGridLayout; | ||
ui->wid_chart->setLayout(layout); | ||
layout->addWidget(chartView); | ||
chartView->show( ); | ||
|
||
} | ||
|
||
MainWindow::~MainWindow() | ||
{ | ||
delete ui; | ||
//Обяхательно освободим память | ||
delete chart; | ||
delete graphClass; | ||
delete chartView; | ||
} | ||
|
||
/*! | ||
@brief Метод обрабатывает нажатие кнопки "Очистить" | ||
*/ | ||
void MainWindow::on_pb_clear_clicked() | ||
{ | ||
//Вызовем метод очистки графика. | ||
graphClass->ClearGraph(chart); | ||
} | ||
|
||
/*! | ||
@brief Метод обрабатывает нажатие кнопки "Построить" | ||
*/ | ||
void MainWindow::on_pb_updGraph_clicked() | ||
{ | ||
|
||
//Перед новой отрисовкой очистим графики | ||
if(chart->series().isEmpty() == false){ | ||
graphClass->ClearGraph(chart); | ||
} | ||
|
||
|
||
//создадим контейнеры для хранения данных | ||
QVector<double> x; | ||
QVector<double> y; | ||
|
||
//считываем шаг сетки и граничные значения | ||
double step = ui->dsB_step->value(); | ||
|
||
//Шаг не может быть равен нулю | ||
if(step <= 0){ | ||
step = 0.1; | ||
ui->dsB_step->setValue(0.1); | ||
} | ||
|
||
double minVal = ui->dsB_minRange->value(); | ||
double maxVal = ui->dsB_maxRange->value() + step; //утчтем ноль | ||
|
||
/* | ||
Формируем сетку значений, ресайзим вектор и заполняем его | ||
*/ | ||
double steps = round(((maxVal-minVal)/step)); | ||
x.resize(steps); | ||
x[0] = minVal; | ||
for(int i = 1; i<steps; i++){ | ||
x[i] = x[i-1]+step; | ||
} | ||
|
||
/* | ||
* Заполняем массив значений в зависимости | ||
* от выбранного флажка | ||
*/ | ||
y.resize(steps); | ||
//В случае если выбран график косинуса | ||
if(ui->rb_cos->isChecked()){ | ||
//Добавляем все точки в массив | ||
for(int i = 0; i<steps; i++){ | ||
y[i] = cos(x[i]); | ||
} | ||
//Добавляем данные в серию | ||
graphClass->AddDataToGrahp(x,y, FIRST_GRAPH); | ||
|
||
} | ||
else if(ui->rb_sinx_x->isChecked()){ | ||
for(int i = 0; i<steps; i++){ | ||
y[i] = sin(x[i])/x[i]; | ||
} | ||
graphClass->AddDataToGrahp(x,y, FIRST_GRAPH); | ||
} | ||
//Если выбрана мышь | ||
else if(ui->rb_mouse->isChecked()){ | ||
|
||
minVal = -7; | ||
step = 0.01; | ||
maxVal = 7; | ||
steps = round(((maxVal-minVal)/step)+2); | ||
x.clear(); | ||
x.resize(steps); | ||
x[0] = minVal; | ||
for(int i = 1; i<steps; i++){ | ||
x[i] = x[i-1]+step; | ||
} | ||
|
||
QVector<double> data; | ||
data.resize(steps); | ||
y.clear(); | ||
y.resize(steps); | ||
|
||
for(int i = 0; i<2; i++){ | ||
data = ConstructMouse(i, x); | ||
graphClass->AddDataToGrahp(x, data, i); | ||
data.clear(); | ||
} | ||
} | ||
|
||
|
||
//Обновим график, т.е. добавим сформированыые серии на график | ||
graphClass->UpdateGraph(chart); | ||
//И отобразим его. | ||
ViewGraph(); | ||
|
||
} | ||
|
||
void MainWindow::ViewGraph() | ||
{ | ||
chartView->chart()->createDefaultAxes(); | ||
chartView->show( ); | ||
} | ||
|
||
|
||
/*! | ||
@brief | ||
*/ | ||
QVector<double> MainWindow::ConstructMouse(int numForm, QVector<double> x) | ||
{ | ||
|
||
QVector<double> result; | ||
result.resize(x.size()); | ||
|
||
double tmpX = 0; | ||
if(numForm == 0){ | ||
|
||
for(int i = 0; i<x.size(); i++){ | ||
tmpX = abs(x[i]); | ||
|
||
if(tmpX>7){ | ||
|
||
continue; | ||
|
||
} | ||
else if (tmpX < 0.5){ | ||
|
||
result[i] = 2.25; | ||
|
||
} | ||
else if(0.5 <= tmpX && tmpX < 0.75 ){ | ||
|
||
result[i] = 3 * tmpX + 0.75; | ||
|
||
} | ||
else if (0.75 <= tmpX && tmpX< 1.0){ | ||
|
||
result[i] = 9 - 8 * tmpX; | ||
|
||
} | ||
else if(1 <= tmpX && tmpX < 3){ | ||
|
||
result[i] = (1.5 - 0.5 * tmpX - 3 * sqrt(10) / 7 * (sqrt(3 - tmpX*tmpX + 2 * tmpX) - 2)); | ||
|
||
} | ||
else if(3 <= tmpX && tmpX <= 7){ | ||
|
||
result[i] = 3 * sqrt(-((tmpX / 7)*(tmpX / 7)) + 1); | ||
|
||
} | ||
|
||
} | ||
} | ||
else if(numForm == 1){ | ||
|
||
for(int i = 0; i< x.size(); i++){ | ||
|
||
tmpX = abs(x[i]); | ||
|
||
if(tmpX > 7){ | ||
continue; | ||
} | ||
else if(0 <= tmpX && tmpX< 4 ){ | ||
|
||
result[i] = (abs(tmpX / 2) - (3*sqrt(33) - 7) / 112 * tmpX*tmpX + sqrt(1 - (abs(tmpX - 2) - 1)*(abs(tmpX - 2) - 1)) - 3); | ||
} | ||
else if(4 <= tmpX && tmpX <= 7){ | ||
|
||
result[i] = -3 * sqrt(-((tmpX / 7)*(tmpX / 7)) + 1); | ||
} | ||
} | ||
} | ||
|
||
return result; | ||
} | ||
|
||
|
||
|
Oops, something went wrong.