Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > TChart и Array


Автор: Yump 11.1.2008, 18:33
Подскажите алгоритм плз.

  Есть два динамических массива, куда пишутся значения X и Y.
  Эти же значения выводятся на TChart. Всё делается по таймеру.
  На график значения выводятся в трех режимах
  1) С "прокруткой" - последние значения удаляются, новый добавляются, если количество точек стало больше чем например 100;
  2) Данные просто добавляются, но если на время переключить на п.1, а потом вернуться, то первоначальных данных на графике не будет;
  3) Если запись данных только началась или не достигла "прокрутки" (как в п.1), то значения добавляются как в п.2, а если шла "прокрутка", то на график сначала выводятся все значения X, Y записанные в массивах, а затем продолжается запись новых значений, то есть значения выводятся с самого начала записи.

 Конструкция примерно такая:


Код

  SetLength(X_Array,Count);
  SetLength(Y_Array,Count);
  X:=Rand...
  Y:=Rand...
  X_Array[Count-1]:=X;
  Y_Array[Count-1]:=Y;
  case RadioGroup1.ItemIndex of

    0:  begin
          j:=0;
          Series1.AddXY(x,y);
          if Series1.Count>100 then
            begin
              while j<Series1.Count-100 do
                begin
                  Series1.Delete(j);
                end;
            end;
        end;

    1:  Series1.AddXY(X,Y);

    2:  ???
  end;
  inc(Count);

                

Как сделать 3-ий вариант??? Помогите, пожалуйста!

Автор: remax 12.1.2008, 00:37
Цитата(Yump @  11.1.2008,  18:33 Найти цитируемый пост)
Как сделать 3-ий вариант??? Помогите, пожалуйста! 

Нет проблем:
1)Обработай событие переключения режима:
- Очисти серию
- В цикле добавь в нее содержимое массивов
2) В твоей обработке совмести режим 3 и режим 2  (2 и 1 соответствеено значения RadioGroup1.ItemIndex)

Автор: Yump 12.1.2008, 08:14
remax
Спасибо за ответ!

Сделал так:

Добавил событие - 

Код

procedure TForm1.RadioGroup1Click(Sender: TObject);
var
  i: integer;
begin
  if RadioGroup1.ItemIndex=2 then
    begin
      Series1.Clear;
      i:=0;
      while i<Length(X_Array) do
        begin
          Series1.AddXY(X_Array[i],Y_Array[i]);
          inc(i);
        end;
    end;
end;


список выглядит так - 

    
Код

    0:  begin
          j:=0;
          Series1.AddXY(X,Y);
          if Series1.Count>100 then
            begin
              while j<Series1.Count-100 do
                Series1.Delete(j);
            end;
        end;

    1:  Series1.AddXY(X,Y);

    2:  Series1.AddXY(X,Y); //или можно в onClick сделать перенос на индекс 1


Если оставить пункт 2 пустым, то массив отрисовывается, а если сделать как показано выше, то отрисовывается неправильно - сначала идет скачок, потом прямая линия, потом добавляются новые значения, значения записанные ранее на график не добавляются. Где я ошибся ?

Автор: remax 12.1.2008, 11:39
1) процедуру RadioGroup1Click лучше написать так:
Код

procedure TForm1.RadioGroup1Click(Sender: TObject);
var
  i: integer;
begin
  if RadioGroup1.ItemIndex=2 then
    begin
      Series1.Clear;
      for i:=0 to Length(X_Array)-1 do
          Series1.AddXY(X_Array[i],Y_Array[i]);
    end;
end


мелочь, но приятно

2) в твоей обработке
Код

case RadioGroup1.ItemIndex of
    0:  begin
          j:=0;
          Series1.AddXY(x,y);
          if Series1.Count>100 then
            begin
              while j<Series1.Count-100 do
                       Series1.Delete(j);
            end;
        end;
    1,2:  Series1.AddXY(X,Y);
  end; //Case 

//++++
series1.ParentChart.update;
//++++


должно быть нормально

Цитата(Yump @  12.1.2008,  08:14 Найти цитируемый пост)
Если оставить пункт 2 пустым, то массив отрисовывается, а если сделать как показано выше, то отрисовывается неправильно
 Честно говоря, загадочно. 

А в принципе, если у тебя X меняется с равным шагом, я бы поменял идеологию:
Все точки добавлять в серию (тогда и массивы не нужны), а в зависимости от режима менять диапазон отображения по X. По умолчанию там выставлено авто определение минимума и максимума.

Автор: Yump 12.1.2008, 12:42
Цитата

мелочь, но приятно


Просто где-то читал, что предпочтительнее использовать цикл while вместо for, хотя, может быть я и ошибаюсь.

Цитата

А в принципе, если у тебя X меняется с равным шагом, я бы поменял идеологию:


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


Цитата

Честно говоря, загадочно.
 

Всё равно - вот такая ерунда (если переключить в 3-ий режим после начала прокрутки):

user posted image

Автор: Yump 12.1.2008, 12:40
Цитата

мелочь, но приятно


Просто где-то читал, что предпочтительнее использовать цикл while вместо for, хотя, может быть я и ошибаюсь.

Цитата

А в принципе, если у тебя X меняется с равным шагом, я бы поменял идеологию:


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


Цитата

Честно говоря, загадочно.
 

Всё равно - вот такая ерунда (если переключить в 3-ий режим после начала прокрутки):

user posted image

Автор: Yump 12.1.2008, 13:15
Цитата

процедуру RadioGroup1Click лучше написать так:


читал где-то, что предпочтительнее использовать цикл while, хотя может быть я и ошибаюсь.

Цитата

А в принципе, если у тебя X меняется с равным шагом, я бы поменял идеологию:


В том и дело, что X меняется с разным шагом, значения все равно должны записываться, хотя могу на графике и не отображаться.

Цитата

 Честно говоря, загадочно. 


всё равно вот такая ерунда получается:

http://ipicture.ru/uploads/080112/RnhWD2e1nL.jpg

Добавлено через 9 минут и 8 секунд
Цитата

процедуру RadioGroup1Click лучше написать так:


читал где-то, что предпочтительнее использовать цикл while, хотя может быть я и ошибаюсь.

Цитата

А в принципе, если у тебя X меняется с равным шагом, я бы поменял идеологию:


В том и дело, что X меняется с разным шагом, значения все равно должны записываться, хотя могу на графике и не отображаться.

Цитата

 Честно говоря, загадочно. 


всё равно вот какая-то ерунда получается... :(

Автор: Yump 12.1.2008, 12:51
Цитата

процедуру RadioGroup1Click лучше написать так:


читал где-то, что предпочтительнее использовать цикл while, хотя может быть я и ошибаюсь.

Цитата

А в принципе, если у тебя X меняется с равным шагом, я бы поменял идеологию:


В том и дело, что X меняется с разным шагом, значения все равно должны записываться, хотя могу на графике и не отображаться.

Цитата

 Честно говоря, загадочно. 


всё равно вот такая ерунда получается:

user posted image

Автор: Yump 12.1.2008, 13:30
Удалите, пожайлуйста, 3 лишних сообщения.

Автор: remax 12.1.2008, 14:36
1) Цикл While заведомо медленнее, чем For. Так как в For только один раз просчитывается заголовок (в начале цикла) и потом тело цикла выполняется заданное количество раз. А в цикле While  перед каждой иттерацией проверяется условие в заголовке цикла. Поэтому, в тех случаях когда мы четко знаем сколько раз нужно выполнить тело цикла, предпочтительней For. 

2) Судя по твоему рисунку у тебя проскакивает точка с нулевой координатой X. Посмотри внимательно как ты заполняешь массив, нет ли ошибок в индексах....

Добавлено через 6 минут и 30 секунд
3) Раз не меняем идеологию, значит слегка оптимизируем твой код.
Код

0:  begin
          Series1.AddXY(x,y);
          while Series1.Count>100 do
                       Series1.Delete(0);
      end;

Автор: Yump 12.1.2008, 14:45
Цитата

1)


Спасибо, буду знать, не помню откуда я это взял...

Цитата

2)


С этой ошибкой разобрался. Невнимательность. В разделе case координата X умножалась, а в цикле построения графика из массива нет...

Единственное, что ещё хотел спросить - зачем эта строка?

Код

series1.ParentChart.update;

Автор: remax 12.1.2008, 14:51
Цитата(Yump @  12.1.2008,  14:45 Найти цитируемый пост)
Единственное, что ещё хотел спросить - зачем эта строка?

Выделить всёкод Pascal/Delphi
1:
    
series1.ParentChart.update;

Чтобы гарантированно обновилась картинка в TChart. Предполагается, что должно происходить при каждом изменении в сериях данных, но, из-за внутренней оптимизации в глубинах TChart, это далеко не факт....

Добавлено через 1 минуту и 43 секунды
Если проблема решена, не забудь отметить это в теме, чтобы ее закрыть как решеную...

Автор: Yump 12.1.2008, 15:24
Всё ясно, большое спасибо за помощь!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)