MikroC, Рисование линейного графика

Я пытаюсь создать функцию, которая будет рисовать линейный график в определенном окне на экране GLCD.

Предположим, что ось x окна проходит от пикселя 24 до 205 (слева направо), а ось y проходит от пикселя 55 до 5 (от низкого до высокого).

Мне просто нужен график, чтобы добавить новое значение (или точку) всякий раз, когда доступны новые данные. Таким образом, я могу вызвать обновление графика в процедуре сбора данных. Это не проблема.

Последнее значение всегда нужно добавлять в самую правую позицию на графике, которая равна 205. Поэтому мне нужно будет очистить эту линию и нарисовать новое значение/точку. Тоже без проблем.

T6963C_line(205, 5, 205, 55, T6963C_BLACK); //Clearing the whole line
T6963C_dot(205, posy, T6963C_WHITE);        //Drawing new dot

Но в чем я не уверен, так это в том, как сместить все предыдущие значения/точки на одно место влево при обновлении (каждый раз, когда новое значение/точка добавляется в x-позицию 205), пока оно не достигнет границы окна , то есть 22.

Любая помощь будет очень признательна!

ДОБАВЛЕНИЕ:

int posy1[181];
int i1;

 for(i1 = 0; i1 < 181 - 1; i1++)
 {
     T6963C_dot(i1 + 24, posy1[i1], T6963C_BLACK); //Erase old dots
 }
 for(i1 = 0; i1 < 181 - 1; i1++)
 {
     posy1[i1] = posy1[i1 + 1]; //Shift array
 }
 posy1[181] = EQ; //Add new value (EQ) to array
 for(i1 = 0; i1 < 181 - 1; i1++)
 {
     T6963C_dot(i1 + 24, posy1[i1], T6963C_WHITE); //Redraw dots
 }

person Felix    schedule 10.08.2013    source источник


Ответы (1)


Создайте массив ширины ваших данных и сохраните там значения y. Затем при добавлении нового значения сотрите предыдущие точки, сдвиньте значения в массиве на одну позицию вниз и перерисуйте их. Наконец, добавьте позицию y новой точки в конец вашего массива.

Это общая идея; возможно множество оптимизаций. Чтобы стереть точку в известной позиции y, вам не нужно рисовать вертикальную линию — достаточно нанести на нее одну черную точку. Кроме того, вам не нужно физически копировать каждый plot[x+1] в plot[x] — вы можете оставить массив как есть и просто обновить ширину данных модуля индекса смещения.

person Jongware    schedule 10.08.2013
comment
Спасибо за ответ! Если вы видите выше, я добавил то, что, по моему мнению, является основой того, что вы говорите. Хотя я не могу правильно понять переменные/уравнения. Не могли бы вы мне помочь? - person Felix; 10.08.2013
comment
От 24 до 205 — это 182 элемента, а не 181. Чтобы стереть/нарисовать все точки, вы должны использовать for (i1=0; i1<WIDTH; i1++)WIDTH=182) без -1. (Однако вам делает нужно вычесть единицу для цикла копирования, иначе у вас закончится массив.) Если вы сможете заставить это работать правильно, я покажу, как использовать модуль чтобы избежать дорогостоящей операции перемещения. - person Jongware; 12.08.2013