Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 10.03.2011, 12:16   #1
A-IX-2
Форумчанин
 
Аватар для A-IX-2
 
Регистрация: 08.10.2010
Сообщений: 101
Репутация: 21
По умолчанию Анимация

Есть таблица данных, где хранится изменение значения давления(p) по времени. Нужно это изменение отобразить визуально, например в Image. Закрашивание должно происходить следующим образом: первая линия должна иметь ярко красный цвет, затем эта же линия должна сместиться, и за ней рисуется ещё одна линия, но уже немного светлее, за ней ещё светлее и т.д. У меня получается просто закрашивание по данным таблицы, а не во времени, т.е. более светлая линия идёт после яркой, а надо наоборот(надеюсь, понятно выразился).
Вот как я делаю:

Код:

procedure TForm3.Timer1Timer(Sender: TObject);
begin
  p:=StrToFloat(StringGrid1.Cells[1,i]);
  With Image1.Canvas do
  begin
    if p<=0.1 then Pen.Color:=c1[110];
    if (p>0.1) and (p<=0.2) then Pen.Color:=c1[120];
    if (p>0.2) and (p<=0.3) then Pen.Color:=c1[130];
    if (p>0.3) and (p<=0.4) then Pen.Color:=c1[140];
    if (p>0.4) and (p<=0.5) then Pen.Color:=c1[150];
    if (p>0.5) and (p<=0.6) then Pen.Color:=c1[160];
    if (p>0.6) and (p<=0.7) then Pen.Color:=c1[170];
    if (p>0.7) and (p<=0.8) then Pen.Color:=c1[180];
    if (p>0.8) and (p<=0.9) then Pen.Color:=c1[190];
    if (p>0.9) and (p<=1) then   Pen.Color:=c1[200];
    i:=i+1;
    MoveTo(k,0);
    LineTo(k,Image1.Height);
    k:=k+1;
    if k>Image1.Width then Timer1.Enabled:=False;
  end;
end;


Последний раз редактировалось A-IX-2; 10.03.2011 в 13:37.
A-IX-2 вне форума   Ответить с цитированием
Старый 10.03.2011, 14:52   #2
MeTeOpA
Форумчанин
 
Аватар для MeTeOpA
 
Регистрация: 17.02.2010
Сообщений: 194
Репутация: 24
По умолчанию

Если я правильно понял то есть 1мерный массив где хранится ряд значений по которому нужно вывести анимированную диаграмму?
MeTeOpA вне форума   Ответить с цитированием
Старый 10.03.2011, 15:44   #3
A-IX-2
Форумчанин
 
Аватар для A-IX-2
 
Регистрация: 08.10.2010
Сообщений: 101
Репутация: 21
По умолчанию

Ну можно и так сказать. У меня никак не получается по времени сделать. Вот, допустим, есть труба, в которую подается жидкость под определённым давлением и этот напор падает. В первом сечении трубы в момент времени t=0.1c давление p=10, в следующий момент времени t=0.2с давление в том же сечении p=9, а во втором сечении 10, потом в третьем 10, во втором 9 и в первом 8 и т.д. При считывании из таблицы получается, что первое сечение закрашивается цветом, соответствующим p=10(т.е. ярко красным), а следующие более светлым, а надо наоборот.
A-IX-2 вне форума   Ответить с цитированием
Старый 10.03.2011, 16:18   #4
A-IX-2
Форумчанин
 
Аватар для A-IX-2
 
Регистрация: 08.10.2010
Сообщений: 101
Репутация: 21
По умолчанию

http://fayloobmennik.net/453516
вот, чтоб было понятно, что там рисуется)
A-IX-2 вне форума   Ответить с цитированием
Старый 10.03.2011, 16:26   #5
ArtGrek
DelphiProger
Профессионал
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Адрес: CypRus
Сообщений: 1,023
Репутация: 167

icq: 495898810
skype: ArtGrek13
По умолчанию

а если просто поменять местами значения, в обратном порядке, разве не помогает? 200 -> 120
Код:

    if (p>0.1) and (p<=0.2) then Pen.Color:=c1[200];

    if (p>0.9) and (p<=1) then   Pen.Color:=c1[120];

__________________
VirusN13
ArtGrek вне форума   Ответить с цитированием
Старый 10.03.2011, 16:42   #6
Sibedir
Тот ещё
Профессионал
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Адрес: г. Барнаул
Сообщений: 2,262
Репутация: 931
По умолчанию

Вообще, на сколько я это понял, данные о давлении должны храниться в 2-х мерном массиве (сечение/время). Или у вас строго по 0,1 убывает? Если это так, то так:
Код:

var
  Form1: TForm1;

implementation

var
  _Iterac, _MaxIterac: Cardinal;
  P: array of Real;

function PToColor (R: Real): TColor;
var
  b: Byte;
begin
  if R < 0 then R := 0;
  if R > 1 then R := 1;

  b := 255 - Round(R*255);

  Result := RGB (255, b, b);
end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  _p: Real;
begin
  with Image1.Canvas do begin
    Brush.Color := clGreen;
    FillRect(Canvas.ClipRect);
  end;

  StringGrid1.RowCount := Image1.Width;
  SetLength (P, Image1.Width);
  _p := 1;
  for i := 0 to Image1.Width-1 do begin
    _p := _p - 0.005;
    StringGrid1.Cells[0,i] := FormatFloat ('0.###', _p);
    P[i] := _p;
  end;

  _Iterac := 1;
  _MaxIterac := Image1.Width+1;
  Timer1.Enabled:=True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  i: Integer;
  _p: Real;
begin
  for i := 1 to _Iterac do begin
    _p := P[i-1];
    Image1.Canvas.Pen.Color := PToColor (_p);
    Image1.Canvas.MoveTo (_Iterac-i,0);
    Image1.Canvas.LineTo (_Iterac-i,Image1.Height);
  end;

  _Iterac := _Iterac + 1;
  if _Iterac = _MaxIterac then begin
    Timer1.Enabled := False;
    ShowMessage('Таймер остановлен');
  end;
end;


Последний раз редактировалось Sibedir; 10.03.2011 в 17:12.
Sibedir вне форума   Ответить с цитированием
Старый 10.03.2011, 17:02   #7
A-IX-2
Форумчанин
 
Аватар для A-IX-2
 
Регистрация: 08.10.2010
Сообщений: 101
Репутация: 21
По умолчанию

Цитата:
Сообщение от ArtGrek Посмотреть сообщение
а если просто поменять местами значения, в обратном порядке, разве не помогает? 200 -> 120
Код:

    if (p>0.1) and (p<=0.2) then Pen.Color:=c1[200];

    if (p>0.9) and (p<=1) then   Pen.Color:=c1[120];

не, тогда он просто будет с самого бледного цвета начинать рисовать
A-IX-2 вне форума   Ответить с цитированием
Старый 10.03.2011, 17:07   #8
A-IX-2
Форумчанин
 
Аватар для A-IX-2
 
Регистрация: 08.10.2010
Сообщений: 101
Репутация: 21
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Вообще, на сколько я это понял, данные о давлении должны храниться в 2-х мерном массиве (сечение/время). Или у вас строго по 0,1 убывает?
Да сейчас в принципе не важно, как давление изменяется, главное, что оно падает, а время можно как угодно задать. Меня интересует, как это всё визуализировать правильно. Вот с двумерным массивом надо попробовать.
A-IX-2 вне форума   Ответить с цитированием
Старый 10.03.2011, 17:14   #9
Sibedir
Тот ещё
Профессионал
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Адрес: г. Барнаул
Сообщений: 2,262
Репутация: 931
По умолчанию

Цитата:
Вот с двумерным массивом надо попробовать.
А чё там пробовать? Вы опишите четкую математическую модель.
Sibedir вне форума   Ответить с цитированием
Старый 10.03.2011, 17:30   #10
A-IX-2
Форумчанин
 
Аватар для A-IX-2
 
Регистрация: 08.10.2010
Сообщений: 101
Репутация: 21
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Вообще, на сколько я это понял, данные о давлении должны храниться в 2-х мерном массиве (сечение/время). Или у вас строго по 0,1 убывает? Если это так, то так:
Код:

var
  Form1: TForm1;

implementation

var
  _Iterac, _MaxIterac: Cardinal;
  P: array of Real;

function PToColor (R: Real): TColor;
var
  b: Byte;
begin
  if R < 0 then R := 0;
  if R > 1 then R := 1;

  b := 255 - Round(R*255);

  Result := RGB (255, b, b);
end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  _p: Real;
begin
  with Image1.Canvas do begin
    Brush.Color := clGreen;
    FillRect(Canvas.ClipRect);
  end;

  StringGrid1.RowCount := Image1.Width;
  SetLength (P, Image1.Width);
  _p := 1;
  for i := 0 to Image1.Width-1 do begin
    _p := _p - 0.005;
    StringGrid1.Cells[0,i] := FormatFloat ('0.###', _p);
    P[i] := _p;
  end;

  _Iterac := 1;
  _MaxIterac := Image1.Width+1;
  Timer1.Enabled:=True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  i: Integer;
  _p: Real;
begin
  for i := 1 to _Iterac do begin
    _p := P[i-1];
    Image1.Canvas.Pen.Color := PToColor (_p);
    Image1.Canvas.MoveTo (_Iterac-i,0);
    Image1.Canvas.LineTo (_Iterac-i,Image1.Height);
  end;

  _Iterac := _Iterac + 1;
  if _Iterac = _MaxIterac then begin
    Timer1.Enabled := False;
    ShowMessage('Таймер остановлен');
  end;
end;

Вот так вот и надо, спасибо большое! Видимо я отвечал, когда Вы ещё редактировали)
A-IX-2 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Анимация в СИ !!! Ислам Помощь студентам 1 03.03.2011 09:42
анимация serj-07 Общие вопросы Delphi 17 10.01.2010 11:39
анимация в с++ True_girl Помощь студентам 7 01.03.2009 19:57
Анимация BuTeK1 Паскаль 0 19.01.2009 01:30
анимация волшебная Общие вопросы Delphi 0 17.12.2008 22:01


12:01.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru