Skip to content

Commit

Permalink
Add files via upload
Browse files Browse the repository at this point in the history
  • Loading branch information
Sniper53 authored Apr 5, 2023
1 parent 816efd4 commit b32b907
Show file tree
Hide file tree
Showing 17 changed files with 8,958 additions and 0 deletions.
40 changes: 40 additions & 0 deletions 07/07_GraphicsCharts/CMakeLists.txt
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)

72 changes: 72 additions & 0 deletions 07/07_GraphicsCharts/graphicchart.cpp
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]);
}

}




32 changes: 32 additions & 0 deletions 07/07_GraphicsCharts/graphicchart.h
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
12 changes: 12 additions & 0 deletions 07/07_GraphicsCharts/main.cpp
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();
}
223 changes: 223 additions & 0 deletions 07/07_GraphicsCharts/mainwindow.cpp
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;
}



Loading

0 comments on commit b32b907

Please sign in to comment.