Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TChart и Array, Работа с графиками 
V
    Опции темы
Yump
Дата 11.1.2008, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.1.2008

Репутация: нет
Всего: нет



Подскажите алгоритм плз.

  Есть два динамических массива, куда пишутся значения 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-ий вариант??? Помогите, пожалуйста!
PM MAIL   Вверх
remax
Дата 12.1.2008, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: нет
Всего: 5



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

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


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
Yump
Дата 12.1.2008, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.1.2008

Репутация: нет
Всего: нет



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 пустым, то массив отрисовывается, а если сделать как показано выше, то отрисовывается неправильно - сначала идет скачок, потом прямая линия, потом добавляются новые значения, значения записанные ранее на график не добавляются. Где я ошибся ?
PM MAIL   Вверх
remax
Дата 12.1.2008, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: нет
Всего: 5



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. По умолчанию там выставлено авто определение минимума и максимума.


Это сообщение отредактировал(а) remax - 12.1.2008, 12:03


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
Yump
Дата 12.1.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.1.2008

Репутация: нет
Всего: нет



Цитата

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


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

Цитата

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


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


Цитата

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

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

user posted image
PM MAIL   Вверх
Yump
Дата 12.1.2008, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.1.2008

Репутация: нет
Всего: нет



Цитата

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


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

Цитата

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


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


Цитата

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

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

user posted image
PM MAIL   Вверх
Yump
Дата 12.1.2008, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.1.2008

Репутация: нет
Всего: нет



Цитата

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


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

Цитата

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


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

Цитата

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


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

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

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

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


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

Цитата

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


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

Цитата

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


всё равно вот какая-то ерунда получается... :(
PM MAIL   Вверх
Yump
Дата 12.1.2008, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.1.2008

Репутация: нет
Всего: нет



Цитата

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


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

Цитата

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


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

Цитата

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


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

user posted image
PM MAIL   Вверх
Yump
Дата 12.1.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.1.2008

Репутация: нет
Всего: нет



Удалите, пожайлуйста, 3 лишних сообщения.
PM MAIL   Вверх
remax
Дата 12.1.2008, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: нет
Всего: 5



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;



--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
Yump
Дата 12.1.2008, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.1.2008

Репутация: нет
Всего: нет



Цитата

1)


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

Цитата

2)


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

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

Код

series1.ParentChart.update;

PM MAIL   Вверх
remax
Дата 12.1.2008, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: нет
Всего: 5



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

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

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

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


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
Yump
Дата 12.1.2008, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.1.2008

Репутация: нет
Всего: нет



Всё ясно, большое спасибо за помощь!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0528 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.