|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
16.07.2009, 12:50 | #1 |
Регистрация: 16.07.2009
Сообщений: 5
|
Скорость рисования графиков
Здравствуйте, уважаемые программисты.
В общем, постановка задачи такова: нарисовать в один поток 10 млн точек максимально быстро. По оси X - значения от 0 до 10 млн, по оси Y - от 0 до 1. Все эти значения (Y) записаны в динамический массив, тип данных - float. Пробовал рисовать на канве и в TChart, канва рисует несколько быстрее, но все равно скорость выполнения оставляет желать. Естесственно, на экран должны выводиться все точки без исключения. Посоветуйте, как можно (если можно) быстрее нарисовать такое количество точек. |
16.07.2009, 14:06 | #2 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,069
|
Учитывая, что на экране все эти миллионы точек не отобразятся в любом случае (из-за разрешения экрана хотя бы и его размера):
Выбираем вариант рисования на канве: Вводим понятия: экранные координаты и мировые координаты. Экранные - это координаты на экране. Мировые - это координаты, которые 0..10 млн. и 0..1. Пишется простенький цикл по экранным координатам х (от 1 до 1024 например, если полноэкранный режим и ширина 1024 точки). Эту экранную координату переводим в мировую координату х. Ищем по найденному значению мировой игрик, переводим его в экранную координату. Вот у нас и известны координаты очередной точки. Рисуем её банальным LineTo и идём дальше. Преобразования экранные-мировые координаты в любом случае потребуются, но зато тут получается всего тысяча итераций, вместо 10 млн. Таким образом, выигрыш в скорости очевиден, а в плане внешнего вида ухудшений никаких не будет, ибо привязка идёт к устройству отображения и лучше уже не нарисуешь (при цикле 0..10 млн. из-за округлений тупо в одном и том же месте будут точки рисоваться). Из возможных проблем: при слишком малом масштабе пропадут резкие перепады графика. Для хоть какого-то устранения этой особенности, можно проецировать на экранную точку не одну точку графика, а отрезок, путём нахождения его усредненных значений. ЗЫ. Можно еще с OpenGL поразбираться в данном вопросе, ибо он шустрее канвы будет. |
16.07.2009, 21:38 | #3 | |
Студент, не
Старожил
Регистрация: 29.01.2009
Сообщений: 2,067
|
Чем больше рисунок - тем дольше он рисуется...
Цитата:
Всё ужмётся в сплошную линию...
I am the First of Cyber Evolution...
I am the First to Program your Future... |
|
16.07.2009, 21:45 | #4 |
Регистрация: 16.07.2009
Сообщений: 5
|
pu4koff, безусловно, этот способ тоже использую. В TChart это свойство DrawAllPoints у Fast Line.
В принципе на нем и остановился до того, как писал сюда. С OpenGL поэкспериментирую. Спасибо. DomiNick, в масштабе это будет прямоугольник, занимающий весь экран. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
используя оператор цикла и графики , составте программу для рисования на экране рисунка | 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 |