С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 12.11.2018
Сообщений: 54

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

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

Студворк — интернет-сервис помощи студентам
Приветствую! По заголовку, необходимо написать программу на С++(желательно в 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
381 / 324 / 65
Регистрация: 14.10.2014
Сообщений: 1,377
08.03.2020, 18:42
первое, что приходит в голову:
если структура файла известна (а здесь она известна - это два столбца - X и Y), то можно создать два массива - один для X, другой для Y и читать значения по-переменно то в один массив, то в другой - сразу из файла.
0
0 / 0 / 0
Регистрация: 12.11.2018
Сообщений: 54
08.03.2020, 19:01  [ТС]
Так проблема в том, как это реализовать, мне приходила такая мысль
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
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
381 / 324 / 65
Регистрация: 14.10.2014
Сообщений: 1,377
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
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,267
08.03.2020, 19:45
Задача разбивается на этапы:

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

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

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

То есть массивы m и n выступают в качестве своеобразного буфера, в который мы считываем данные из файла
1
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,267
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
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
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
381 / 324 / 65
Регистрация: 14.10.2014
Сообщений: 1,377
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
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru