Поиск:

Ответ в темуСоздание новой темы Создание опроса
> построение графика в реальном времени 
:(
    Опции темы
gordmiand
Дата 21.2.2008, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



1. Подскажите пожалуйста как можно построить какой-либо график на TChart-е не мгновенно, а чтобы график строился "во времени" - т.е. плавное построение графика....
2. Как сделать автоматическую плавную прокрутку по горизонтали графика TChart так, чтобы на экране всегда был виден процесс построения графика в реальном времени (см. п.1)
(подскажите программную реализацию п.1 и п.2)
PM MAIL   Вверх
jonie
Дата 22.2.2008, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



1. добавляешь по точкам, давая приложению обновлять график (отдельным потоком или application->processmessage()) ..


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
petlyura
Дата 22.2.2008, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



1) cur.x = (int) (double(dt - diap->Start) * Rect.Width() / diap->Range + Rect.left + 0.5);                  //get x-coordinate for the current time
cur.y = (int) (Rect.bottom - ((Options->Value - Options->LowValue) * Rect.Height()) / (Options->HighValue - Options->LowValue)); //get y-coordinate regard the value for the current time

Отрисовывая каждую точку cur с координатами cur.x, cur.y, необходимо производить вычисления:
Options - экземпляр какого-то класса, хранящего миним., макс. возможные значения и текущее значение.
Rect - область прорисовки.
diap - экземпляр структуры, например,
 struct TTimeRange
{
  TDateTime Start;              //начальное значение
  double Range;                 // дипазон (в сек.)
};
2) diap->Start = CurrentTime - diap->Range;
CurrentTime - текущее время.
Так в какой-то структуре хранишь значения, времена этих значений. С каждым новым значением, добавляешь его и текущее время в эту структуру (можно, все там организовать в виде некоторого стека). И для каждого значения прорисовываешь график по точкам, вычисляя координаты (1). После каждого такта прорисовки графика (к примеру, 0,5 сек, можно использовать TTimer) меняешь значение diap->Start (2), и опять перерисовываешь.
Где-то вот так!

PM MAIL   Вверх
petlyura
Дата 22.2.2008, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я тут подумал, и решил, что лучше вот так вот

class TGraf : public TChart
{
public:
    TGraf( TForm* owner, TPoint point );
    void Draw1();  //прорисовка
    void __fastcall GetAxisLabel (TChartAxis*Sender,TChartSeries*Series, int ValueIndex,String& LabelText); //изменение оси
    int  MAXNUMBERGRAPHPOINT; //кол-во точек на графике
private:
    int CurrentPoint;  //номер текущей точки
    TDateTime CurrentDateTime;  //текущее время
    float Zn; //значение точки, лучше перевести в значение в пикселях на графике пропорционально
    bool First; //первое отображение?
    };

TGraf::TGraf( TForm* owner, TPoint point )
 : TChart(owner)
{
 Foot->Visible = false;
 AllowPanning = pmNone;
 AllowZoom=false;
 ClipPoints = true;

 Legend->Alignment = laBottom;
 Legend->Visible = false;
 // плоский график
 View3D = false;

 TabOrder = 1;
 BevelInner = bvNone;
 BevelOuter = bvNone;
 BorderStyle = bsNone;
 Title->Visible=false;
 Frame->Visible=true;
 Frame->Color = clGray;

 LeftAxis->Automatic=false;
 LeftAxis->AutomaticMaximum = false;
 LeftAxis->AutomaticMinimum = false;
 LeftAxis->Visible=true;

  BottomAxis->Labels = true;
 BottomAxis->MinorTickLength = 0;
 BottomAxis->TickOnLabelsOnly = 0;
 BottomAxis->Automatic=false;
 BottomAxis->AutomaticMaximum = false;
 BottomAxis->AutomaticMinimum = false;
 BottomAxis->RoundFirstLabel=false;
 BottomAxis->LabelStyle=talValue;
 BottomAxis->LabelsFont->Charset = DEFAULT_CHARSET;
 BottomAxis->LabelsFont->Height = -10;
 BottomAxis->LabelsFont->Style.Clear();
 BottomAxis->LabelsSize = 0;
 BottomAxis->AxisValuesFormat="######0.#";
 BottomAxis->Ticks->Color = clBlack;

 if(!MAXNUMBERGRAPHPOINT)
     MAXNUMBERGRAPHPOINT = 60; //к примеру, 60 точек

 OnGetAxisLabel = GetAxisLabel;
 }

//-----------------------------------------------------------------------------
void
TGraf::Draw1() 
{
   
CurrentDateTime = CurrentDateTime.CurrentDateTime(); //текущее время

for(int i=0; i < SeriesCount(); i++)
 {
  Series[i]->AddXY( CurrentPoint, Zn, "", (TColor)clTeeColor ); //добавляем точку
  if(Series[i]->Count() > MAXNUMBERGRAPHPOINT) // если их стало больше 60
     Series[i]->Delete(0); //то старую удаляем
  }
CurrentPoint++;  
if(First) //если отображение первой точки, то не прокручиваем
 {
   First=false;   
 }
 else BottomAxis->Scroll(1,false);  //иначе прокручиваем

}
//------------------------------------------------------------------------------
void __fastcall TGraf::GetAxisLabel(TChartAxis*Sender,TChartSeries*Series, int ValueIndex,String& LabelText)
{  //чтоб внизу под графиком время толково выводилось 
if(!Sender->Horizontal)
   return;
TDateTime d = CurrentDateTime;
CurrentDateTime = CurrentDateTime.CurrentDateTime();
d=d-(double)(CurrentPoint-StrToFloat(LabelText))*DateTimeStep[dtOneSecond];  //если раз в секунду прорисовываешь, ключевое слово dtOneSecond
TDateTime LastTime=d-(int)d;
LabelText=LastTime;
}


PM MAIL   Вверх
Siscipsak
Дата 1.9.2022, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




Модератор: Сообщение скрыто.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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