Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 14.03.2017
Сообщений: 6

Построение графиков с большим количеством точек (Builder6)

26.06.2017, 19:28. Показов 3748. Ответов 4

Студворк — интернет-сервис помощи студентам
Добрый вечер форумчане!
Передо мной возникла задача построения графиков с большим количеством точек (> 1,5 млн) + возможность увеличения и секторное выделение графиков.
Если я решаю свою задачу через TChart, то построение в компоненте идет порядка 8 сек. И это для меня много)
Из этих 8 секунд: 1-1,5 сек затрачивается на чтение данных из файла в динамические массивы, а вот остальное время занимает само построение графиков.
Пробовал рисовать руками посредстваом Image->Canvas... получилось порядка 7 секунд на антологичную задачу + гемор при разработке функций масштабирования.
Пробовал юзать dislin, получается аналогично не быстро + еще больше сложностей с динамическими манипуляциями графиком...
В общем, может есть какие-нибудь идеи на этот счет?
P.S. В работе использую C++ Builder6.
Всем спасибо!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.06.2017, 19:28
Ответы с готовыми решениями:

Рефакторинг: функция с большим количеством параметров
День добрый. Скажите плз, гуру рефакторинга. Вот есть функция и в нее передаётся туча параметров. Как лучше исправить ситуацию? На ум...

Работа с большим количеством динамически созданных компонентов.
На форме динамически создается GroupBox, а на нём множество других компонентов (GroupBox выбран исключительно из-за того, что визуально...

Сделать ProgressBar при зависании формы (работа с большим количеством данных)
Здравствуйте, нужно сделать progress bar на исполнение кода. Суть в том, что иде работа с большими файлами и форма зависает при выполнении...

4
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
28.06.2017, 23:17
что на счет того чтобы создать двумерный массив и построить по нему линию тренда?
1
0 / 0 / 0
Регистрация: 14.03.2017
Сообщений: 6
29.06.2017, 21:17  [ТС]
Цитата Сообщение от QWIPQ Посмотреть сообщение
что на счет того чтобы создать двумерный массив и построить по нему линию тренда?
Добрый вечер!
Погуглил про линию тренда. Мне нужно построить полноценный график, так как необходимо визуальное определение флуктуаций значений (порой в широком диапазоне). Линия тренда - конечно инструмент технического анализа, но для моих целей он не подходит.
0
2642 / 1653 / 267
Регистрация: 19.02.2010
Сообщений: 4,375
29.06.2017, 22:24
Лучший ответ Сообщение было отмечено filzer как решение

Решение

filzer, я бы не рисовал поточечно - а сделал бы так:
- создал 2 массива с числом элементов, равных числу горизонтальных точек той области, где будет отрисован сам график.
- пробежал бы по всем точкам, пересчитывая их горизонтальные координаты в индексы точек массива, и набрал бы статистику по вертикальным мин, макс-значениям (тоже пересчитанным из реальных значений в координаты точек на экране) (для этого и нужно 2 массива - минимумы и максимумы положить), соответствующим горизонтальной координате каждой возможной "экранной" точки.
- вместо полутора миллионов вызовов рисования точки - в итоге стало бы одна-две тысячи (от горизонтального разрешения экрана зависит, и от размера области под график) вызовов рисования точки (если мин и макс вертикальные координаты в этой горизонтальной экранной точке совпадают) или вертикального отрезка (если мин и макс вертикальные координаты таки различны).

Возможный "баг" - при большом увеличении части графика вместо нескольких вертикально расположенных точек будем видеть вертикальный отрезок (а в нём число точек может быть сильно больше), т.е. какие-то человеческие анализы/оценки "на глаз" могут в итоге искажаться.

Производительность (быстрота) проги будет во многом зависеть от того, насколько удачно удастся избавиться от тормозных конверсий плавучих значений в целые числа. А то билдер для этого неявно вызывает свою библиотечную функцию __ftol, которая очень тормозит по сравнению с альтернативами (например, с вариантом из библиотечки Агнера Фога).
Проблемы с конверсией плавучки в целое нет у 64разрядных прог (в свежих версиях Билдера), но у Вас-то шестой...



Другой вариант.
Давно уже не работал с этой частью ВинАПИ, поэтому "спроектирую" во многом наугад.
Можно использовать виндовозовские метафайлы. Тем более, что в Билдере над ними есть класс-обёртка (TMetafile), да и канвас умеет эти метафайлы рисовать.
Рисовал бы в метафайл - а затем все масштабирования делал просто пересчётом границ (координат) отрисовываемой области. Границы надо пересчитать так, чтобы в итоге рамка нужной области совпала с границами канваса/пикчербокса, а всё вылезающее за её пределы должно автоматически обрезаться.


Сорри, если сумбурно/непонятно - но у меня третий час ночи
2
0 / 0 / 0
Регистрация: 14.03.2017
Сообщений: 6
30.06.2017, 17:51  [ТС]
VTsaregorodtsev, спасибо за информацию!
Касательно первого предложенного варианта нашел аналогичные решения на просторах интернета.
Создал компонент Image и рисую в нем через Canvas. Далее открываю файл с данными и помещаю их в 2-а динамических массива.
Затем соотношу размеры изображения и количество точек(получается несколько тыс значений на пиксель).
Затем строю график(можно ориентироваться на средние значения, можно на макс и мин).
Позже поробую поэксперементировать с зумом и пересчетом точек в "нормальные" (получится или нет пока не скажу).
Производительность, даже на первый взгляд, превосходит стандартный TChart. При перехода на работу с бинарными файлами предполагаю еще небольшой прирост производительности (в конечном итоге дающий порядка -1 - -2 сек)
Builder6 но другого пока не предполагается)))
2-ой вариант отчасти напоминает первый), а так как я начал решать свою задачу, то оставлю его про запас)
Спасибо за хороший ответ!
P.S. Если есть ссылки на статьи о последнем билдере (например поясняющие чем он хорош и что он умеет), ты прошу скинуть их мне в личку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.06.2017, 17:51
Помогаю со студенческими работами здесь

Qwt. График с большим количеством точек
Уверен, что проблема решается просто, но она есть: точек графика - 4 320 000 штук. Хочу смотреть на весь график в целом. Если начать...

Сервер с большим количеством клиентов
Собственно возник вопрос как организовать такое? Как люди делают сервера, которые при этом не падают и обслуживают одновременно 3000 и...

Программа с большим количеством форм
Стоит задача сделать программу с большим количеством форм ( около 50), т.е. на форме примерно какой-то текст типа задание, textbox для...

Работа с большим количеством полей
Здравствуйте! Подскажите пожалуйста как можно упростить такую задачу: Есть форма для ввода данных (317 полей с именами 1,2,3...317)....

QTableView с большим количеством ячеек
Собственно, тормозит, не пойму, почему. Пока тестировал 3-5 столбцов и 5-10 строк - все работало отлично. Но когда работаю с 200 строками -...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru