Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.07.2009, 12:50   #1
Master07
 
Регистрация: 16.07.2009
Сообщений: 5
По умолчанию Скорость рисования графиков

Здравствуйте, уважаемые программисты.

В общем, постановка задачи такова: нарисовать в один поток 10 млн точек максимально быстро. По оси X - значения от 0 до 10 млн, по оси Y - от 0 до 1. Все эти значения (Y) записаны в динамический массив, тип данных - float.
Пробовал рисовать на канве и в TChart, канва рисует несколько быстрее, но все равно скорость выполнения оставляет желать. Естесственно, на экран должны выводиться все точки без исключения.

Посоветуйте, как можно (если можно) быстрее нарисовать такое количество точек.
Master07 вне форума Ответить с цитированием
Старый 16.07.2009, 14:06   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Учитывая, что на экране все эти миллионы точек не отобразятся в любом случае (из-за разрешения экрана хотя бы и его размера):
Выбираем вариант рисования на канве:
Вводим понятия: экранные координаты и мировые координаты.
Экранные - это координаты на экране. Мировые - это координаты, которые 0..10 млн. и 0..1.
Пишется простенький цикл по экранным координатам х (от 1 до 1024 например, если полноэкранный режим и ширина 1024 точки). Эту экранную координату переводим в мировую координату х. Ищем по найденному значению мировой игрик, переводим его в экранную координату. Вот у нас и известны координаты очередной точки. Рисуем её банальным LineTo и идём дальше. Преобразования экранные-мировые координаты в любом случае потребуются, но зато тут получается всего тысяча итераций, вместо 10 млн. Таким образом, выигрыш в скорости очевиден, а в плане внешнего вида ухудшений никаких не будет, ибо привязка идёт к устройству отображения и лучше уже не нарисуешь (при цикле 0..10 млн. из-за округлений тупо в одном и том же месте будут точки рисоваться). Из возможных проблем: при слишком малом масштабе пропадут резкие перепады графика. Для хоть какого-то устранения этой особенности, можно проецировать на экранную точку не одну точку графика, а отрезок, путём нахождения его усредненных значений.
ЗЫ. Можно еще с OpenGL поразбираться в данном вопросе, ибо он шустрее канвы будет.
pu4koff вне форума Ответить с цитированием
Старый 16.07.2009, 21:38   #3
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Чем больше рисунок - тем дольше он рисуется...
Цитата:
По оси X - значения от 0 до 10 млн, по оси Y - от 0 до 1.
Я даже представить-то нормально не могу, как монитор это будет отображать...
Всё ужмётся в сплошную линию...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 16.07.2009, 21:45   #4
Master07
 
Регистрация: 16.07.2009
Сообщений: 5
По умолчанию

pu4koff, безусловно, этот способ тоже использую. В TChart это свойство DrawAllPoints у Fast Line.
В принципе на нем и остановился до того, как писал сюда.
С OpenGL поэкспериментирую.
Спасибо.

DomiNick, в масштабе это будет прямоугольник, занимающий весь экран.
Master07 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
используя оператор цикла и графики , составте программу для рисования на экране рисунка maksu6ka2009 Паскаль, Turbo Pascal, PascalABC.NET 3 25.04.2009 13:08
Как объекту рисования (овал) присвоить значение? Град Microsoft Office Excel 8 17.07.2008 10:42
Метод рисования полупрозрачного изображения SalasAndriy Общие вопросы C/C++ 0 14.12.2007 20:26
Программа для рисования иконок kuzmich Софт 9 02.06.2007 00:30