0 / 0 / 0
Регистрация: 12.11.2018
Сообщений: 54

Построение графика по координатам из .txt файла и его линейная аппроксимация (Qt)

08.03.2020, 17:43. Показов 3185. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую! По заголовку, необходимо написать программу на С++(желательно в Qt), которая выгружает из .txt файла координаты (данные в виде стобцов, разделенных табуляцией), строит по координатам график и линейно его аппроксимирует. Сперва, после стандартной подготовки проекта, решил подключить сам файл и разделить координаты на массивы X(n) и Y(n), но не смог написать правильный для этого код. Господа эксперты, будут советы ? (кроме ЧСВшных "иди учи", "сиди читай", "ну ты идиот")
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.03.2020, 17:43
Ответы с готовыми решениями:

Построение графика АЧХ по координатам из файла
Имеется файл с координатами: Синусоида с изменяющейся частотой и Амплитудой (АЧХ). Нужно построить из этих данных АЧХ график Bode Plot,...

Построение графика из txt файла
Есть текстовый файл вида 1.7 2.7 5.5 6.5 2.4 1.2 по этим координатам надо построить график. Подскажите как лучше реализовать и...

Построение графика по данным из txt файла
11.09.2014 10:20:17;1389; 11.09.2014 10:21:17;1390; 11.09.2014 10:22:17;1387; 11.09.2014 10:23:17;1399; 11.09.2014 10:24:17;1365; ...

14
 Аватар для Recrut_rf
374 / 317 / 65
Регистрация: 14.10.2014
Сообщений: 1,354
08.03.2020, 18:42
первое, что приходит в голову:
если структура файла известна (а здесь она известна - это два столбца - X и Y), то можно создать два массива - один для X, другой для Y и читать значения по-переменно то в один массив, то в другой - сразу из файла.
0
0 / 0 / 0
Регистрация: 12.11.2018
Сообщений: 54
08.03.2020, 19:01  [ТС]
Так проблема в том, как это реализовать, мне приходила такая мысль
0
 Аватар для COKPOWEHEU
4052 / 2604 / 432
Регистрация: 09.09.2017
Сообщений: 11,590
08.03.2020, 19:04
Ну, для вывода графика можно использовать обычный feedgnuplot. А вот есть ли стандартное решение для аппроксимации - не знаю. Для себя писал когда-то вот такую реализацию: https://github.com/COKPOWEHEU/Approx Правда, для вашей задачи она несколько избыточна - аппроксимация идет полиномом произвольной степени, а не только первой. Зато можно не писать с нуля.
0
0 / 0 / 0
Регистрация: 12.11.2018
Сообщений: 54
08.03.2020, 19:15  [ТС]
Благодарю, я посмотрю)
0
 Аватар для Recrut_rf
374 / 317 / 65
Регистрация: 14.10.2014
Сообщений: 1,354
08.03.2020, 19:17
Fouly,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <fstream>
 
using namespace std;
 
 
int main()
{
    
    ifstream in("file.txt");
 
    int m[10] = {}, n[10] = {};
 
    int i = 0;
 
    while (!in.eof())
    {
        in >> m[i];
        in >> n[i];
        ++i;
    }
 
    in.close();
 
    for (int i = 0; i < 10; ++i)
    {
        cout << m[i] << '\t' << n[i] << endl;
    }
    cout << endl;   
 
    system("pause");
    return 0;
}
Добавлено через 42 секунды
это для 10 точек если что
0
0 / 0 / 0
Регистрация: 12.11.2018
Сообщений: 54
08.03.2020, 19:35  [ТС]
Можете, пожалуйста, пояснить, в таком коде в массивы сохраняются значения каждого из столбцов по отдельности ?
0
732 / 693 / 110
Регистрация: 29.05.2015
Сообщений: 4,187
08.03.2020, 19:45
Задача разбивается на этапы:

- прочитать из файла текст (цифры)
- по этим цифрам нарисовать отрезки - это будет график без обработки
- с помощью аппроксимации получить координаты дополнительных точек (самое трудное)
- построить полный график с учётом дополнительных точек

Что именно из этого списка вызывает трудности? Делай по этапам, сперва прочитай файл и т.д.

Добавлено через 5 минут
Цитата Сообщение от Fouly Посмотреть сообщение
Можете, пожалуйста, пояснить, в таком коде в массивы сохраняются значения каждого из столбцов по отдельности ?
Да как хочешь. Ты же программист, ты хозяин программы, как сделаешь, так и будет. Хочешь в два массива сохраняй, хочешь в один попеременно числа из первого/второго столбца. Если всё правильно сделать, на экране результат будет одинаковым.
0
 Аватар для Recrut_rf
374 / 317 / 65
Регистрация: 14.10.2014
Сообщений: 1,354
08.03.2020, 19:46
Цитата Сообщение от Fouly Посмотреть сообщение
каждого из столбцов по отдельности
Ну да, потоковый объект будет считывать значение до тех пор, пока ему не попадётся пустой символ (в нашем случае это табуляция). Поэтому первое значение считываем в массив m, далее символ табуляции не считывается, второе значение считывается в массив n. Инкрементируем счётчик и повторяем, пока не достигнем символа конца файла (!in.eof()).

То есть массивы m и n выступают в качестве своеобразного буфера, в который мы считываем данные из файла
1
732 / 693 / 110
Регистрация: 29.05.2015
Сообщений: 4,187
08.03.2020, 19:50
У тебя в файле, по идее, должны быть координаты точек. У каждой точки две координаты (X и Y), читаешь их - можешь нарисовать точку. Читаешь следующие две координаты - рисуешь вторую точку и можешь соединить их отрезком. Что тут непонятного?
0
0 / 0 / 0
Регистрация: 12.11.2018
Сообщений: 54
08.03.2020, 21:37  [ТС]
Без шуток, я ценю, что вы решили уделить время моему вопросу, но к чему столько сарказма ? Если бы я сам мог выполнить задачу, то не обращался бы к другим за советами. Непонятно мне как правильно составить код для построения точек из файла на график. В этом, по сути, главная проблема.

Добавлено через 9 минут
Вот я создал в mainwindow.ui кнопку для построения графика. По идее, нажатие на эту(первую) кнопку должно приводить построению графика по точкам из файла, а нажатие на вторую - к аппроксимации линейной функцией. Вот в чем моя проблема - я не знаю как это правильно сделать.
C++
1
2
3
4
void MainWindow::on_pushButton_clicked()
{
    
}
0
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
08.03.2020, 21:58
Fouly, на форуме есть раздел qt
0
 Аватар для COKPOWEHEU
4052 / 2604 / 432
Регистрация: 09.09.2017
Сообщений: 11,590
09.03.2020, 00:12
Откопал какой-то старый шаблон рисования графика на OpenGL + SDL2:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <GL/gl.h>
#include <GL/glu.h>
#include <stdio.h>
#include <SDL2/SDL.h>
 
SDL_Window *window; //объект окна, нужен для взаимодействия с оконной системой ОС
SDL_GLContext context; //объект OpenGL. Теоретически, все вызовы должны осуществляться его методами, но напрямую - проще
 
struct sGridLines{
  float min;
  float max;
  float diff;
  float pdiff;
};
const sGridLines X = {-5,5,1,0.05};
const sGridLines Y = {-5,5,1,0.05};
#define BG_COLOR 1,1,1
#define FG_COLOR 0,0,0
#define GRID_COLOR 0,1,0
 
bool inout(double x, double y){
    if(fabs(x) > 3 || fabs(y) > 3) return false;
    return (x <= 0 ? fabs(y) >= fabs(x) : (x*x + y*y) <= 9);
}
void draw_grid(){
  float i;
  glBegin(GL_LINES);
    glColor4f(GRID_COLOR,0.2);
    for(i=0;i<X.max;i+=X.diff){glVertex2f(i,Y.min); glVertex2f(i,Y.max);}
    for(i=0;i>X.min;i-=X.diff){glVertex2f(i,Y.min); glVertex2f(i,Y.max);}
    for(i=0;i<Y.max;i+=Y.diff){glVertex2f(X.min,i); glVertex2f(X.max,i);}
    for(i=0;i>Y.min;i-=Y.diff){glVertex2f(X.min,i); glVertex2f(X.max,i);}
    glColor4f(GRID_COLOR,0.5);
    glVertex2f(X.min,0);
    glVertex2f(X.max,0);
    glVertex2f(0,Y.min);
    glVertex2f(0,Y.max);
  glEnd();
}
void draw(){
  float x,y,f=0,sx,sy, sa, ca;
  draw_grid();
  glBegin(GL_POINTS);
  glColor4f(FG_COLOR,1);
  
  for(x=-5; x<5; x+=0.001){
    f+=0.1;
    y = 4*sin(x);
    sa = sin(x); ca = cos(x);
    if(y<0){
      ca=-ca;
      sy = 0.2*sin(-f);
    }else{
      sy = 0.2*sin(f);
    }
    sx = x-sy*ca;
    sy = y+sy*sa;
    
    glBegin(GL_POINTS);
      glVertex2f(sx,sy);
      glVertex2f(x,y);
    glEnd();
    glBegin(GL_LINES);
    //glVertex2f(x,y);
    //glVertex2f(x-ca, y+sa);
    glEnd();
  }
  
  glEnd();
}
 
char update(){
  SDL_Event event;
  while(SDL_PollEvent(&event)){
    if(event.type == SDL_QUIT){return false;}
  }
  return true;
}
 
int main(int argc, char **argv){
  window = SDL_CreateWindow("Open GL + SDL window",SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,
                            800, 600, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
  if(window == NULL){goto FINISH;} //не удалось создать окно - ошибка (на модели не обрабатывается)
  context=SDL_GL_CreateContext(window);
  if(context == NULL){goto FINISH;} //не удалось привязать OpenGL к окну - ошибка (не обрабатывается)
  //настройки OpenGL
  glClearColor(BG_COLOR,0);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluOrtho2D(X.min,X.max, Y.min,Y.max);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  glEnable(GL_BLEND); //разрешение полупрозрачности
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //метод обработки полупрозрачности (это- самый распространенный)
  
  while(update()){
    glClear(GL_COLOR_BUFFER_BIT);
    draw();
    glFlush();
    SDL_GL_SwapWindow(window);
  }
FINISH:
  if(context){SDL_GL_DeleteContext(context); context=0;}
  if(window){SDL_DestroyWindow(window); window=0;}
  SDL_Quit();
}
0
 Аватар для Recrut_rf
374 / 317 / 65
Регистрация: 14.10.2014
Сообщений: 1,354
09.03.2020, 10:23
у меня в коллекции тоже есть пример построения графика в консоли при помощи WinApi функций (довольно давно стянул его себе с этого форума, кто автор, уже не помню):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// график sin(x)
#include <Windows.h>
#include <cstdlib>
#include <math.h>
 
int main()
{
    float x;
    HDC hDC = GetDC(GetConsoleWindow());
    HPEN Pen = CreatePen(PS_SOLID, 2, RGB(255, 255, 255));
 
    SelectObject(hDC, Pen);
 
    MoveToEx(hDC, 0, 85, NULL);
    LineTo(hDC, 200, 85);
 
    MoveToEx(hDC, 100, 0, NULL);
    LineTo(hDC, 100, 170);
 
    for (x = -8.0f; x <= 8.0f; x += 0.01f) // O(100,85) - center
    {
        MoveToEx(hDC, 10 * x + 100, -10 * sin(x) + 85, NULL);//10 - scale
        LineTo(hDC, 10 * x + 100, -10 * sin(x) + 85);
    }   
 
}
попозже попробую к нему прикрутить чтение точек из файла - чисто из спортивного интереса

Fouly,
А вообще, если можно пользоваться WinAPI, то в книге Литвиненко "Технология программирования на С++ win32 API приложения" есть как раз пример построения графика по данным из текстового файла.
0
0 / 0 / 0
Регистрация: 12.11.2018
Сообщений: 54
09.03.2020, 12:48  [ТС]
Благодарю! Правда, я уже разобрался с построением графика по точкам, теперь думаю, как его линейно аппроксимировать)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.03.2020, 12:48
Помогаю со студенческими работами здесь

Построение графика с txt файла (дата, время, параметр)
Здравствуйте. Очень нужна Ваша помощь. Имеется файл txt в нем информация в 3-х столбцах через пробелы (дата время параметр), файл прикрепил...

Аппроксимация (регрессия) двух вариантов - линейная и линейная общего вида
Ребят привет. Не могу понять почему не работает...

Построение графика по координатам
Всем привет! У меня следующая проблема: нужно построить график по точкам, но нужно чтобы линия графика получилась плавной. ...

Построение графика по координатам
Здравствуйте, никогда не работал с графиками в С#, помогите пожалуйста написать. Нужно построить простой график (линия, а точнее будет...

Чтение бинарного файла и построение графика на основе его данных
Начал изучать c++ builder недавно и столкнулся с проблемой. Надо построить график, и при этом чтобы по одной кнопке происходила запись, а...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

Новые блоги и статьи
Тестирование в Python: PyTest, Mock и лучшие практики TDD
py-thonny 28.04.2025
Тестирование кода играет весомую роль в жизненном цикле разработки программного обеспечения. Для разработчиков Python существует богатый выбор инструментов, позволяющих создавать надёжные и. . .
Работа с PDF в Java с iText
Javaican 28.04.2025
Среди всех форматов PDF (Portable Document Format) заслуженно занимает особое место. Этот формат, созданный компанией Adobe, превратился в универсальный стандарт для обмена документами, не зависящий. . .
Динамические массивы в C++ - создание и использование
NullReferenced 27.04.2025
Динамические массивы представляют собой один из фундаментальных инструментов программирования на C++, позволяющий создавать структуры данных, размер которых определяется во время выполнения. . .
Асинхронный JavaScript: Промисы, Async/Await и Fetch API
Reangularity 27.04.2025
Пользователь заходит на веб-страницу, нажимает кнопку и. . . ничего не происходит. Сайт словно замер. Через несколько секунд всё внезапно оживает, но пользователь уже успел закрыть вкладку. Знакомая. . .
Management on GitLab and repository management in Visual Studio code
jigi33 27.04.2025
- repo management on GitLab - CI/ CD in GitLab - VCS repository management in Visual Studio code (see attachments)
Kanban или Scrum - что выбрать?
EggHead 27.04.2025
Kanban и Scrum — уже много лет удерживают лидирующие позиции среди гибких подходов. Руководители проектов и команды разработчиков то и дело сталкиваются с дилеммой: какой из этих двух методов выбрать. . .
Кастомные Middleware на C# в ASP.NET Core
UnmanagedCoder 27.04.2025
Разработка веб-приложений сегодня мало напоминает монолитное программирование прошлых лет. На смену громоздким блокам кода пришла модульная архитектура, где каждый компонент выполняет строго. . .
Анализ и линтинг кода JavaScript: ESLint, Prettier и JSHint
run.dev 26.04.2025
JavaScript прошёл долгий путь от простого языка для анимации веб-страниц до основы современной веб-разработки. С ростом сложности приложений, увеличением кодовых баз и масштабированием команд. . .
Паттерны в Python: Singleton, Factory и Observer
py-thonny 26.04.2025
Паттерны проектирования — это проверенные временем решения типовых проблем разработки программного обеспечения. Их история берёт начало с книги "Приёмы объектно-ориентированного проектирования. . . .
Исключения в C#: Stack Overflow, Access Violation и Out of memory
stackOverflow 26.04.2025
Исключения в C# — это не только механизм оповещения о проблемах, а целое искусство управления потоком выполнения программы в экстремальных ситуациях. Обычное исключение, например,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru