Циклический график с ластиком
В одном потоке идет прием данных в буфер, в другом (по таймеру) идет обновление графика.
Если график доходит до конца экрана, рисование начинается от начала, при этом он затирает перед собой (ластиком) предыдущие линии.
Перерисовывать каждый раз весь график очень долго и замедляет работу программы. Поэтому необходимо обновлять минимальное кол-во данных (т.е. только новые).
Помогите найти пример или алгоритм, реализующий построение и обновление такого графика.
Есть такая задача:
В одном потоке идет прием данных в буфер, в другом (по таймеру) идет обновление графика.
Если график доходит до конца экрана, рисование начинается от начала, при этом он затирает перед собой (ластиком) предыдущие линии.
Перерисовывать каждый раз весь график очень долго и замедляет работу программы. Поэтому необходимо обновлять минимальное кол-во данных (т.е. только новые).
Помогите найти пример или алгоритм, реализующий построение и обновление такого графика.
Перед тем как вывести новое значение графика стери ластиком спереди немного места
Перед тем как вывести новое значение графика стери ластиком спереди немного места
Так я так и делаю!
Но мне кажется график портится в месте стыковки новых и старых линий (я ведь обновляю не весь график, а только последние данные).
Мой алгоритм примерно следующий.:!!!:
Т.к. график цикличен (при заполнении новые значения заменяют старые), то буфер тоже фиксированного размера и характерезуется следующими параметрами, например:
nLength - размер буфера
nCount - кол-во данных в буфере
nFirst - индекс (смещение) первого элемента буфера
При прорисовке графика я запоминаю последние значения:
nLastCount - последний nCount
nLastFirst - последний nFirst
Допустим буфер уже заполнен. Тогда новое значения будет добавляться на место первого элемента. При этом значение nCount уже не меняется, а смещается индекс первого элемента в буфере.
Отсюда, зная последние параметры буфера (nLastCount и nLastFirst), при новом обновлении графика по таймеру можно узнать кол-во новых значений delta.
Если буфер полный (nCount==nLength), то
delta = nFirst - nLastFirst
иначе
delta = nCount - nLastCount
Вот по этой delta я и обновляю график.
Может что-то неправильно в алгоритме?
:-?