Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

Есть таблица данных, где хранится изменение значения давления(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 в 12:37.
A-IX-2 вне форума Ответить с цитированием
Старый 10.03.2011, 13:52   #2
MeTeOpA
Форумчанин
 
Аватар для MeTeOpA
 
Регистрация: 17.02.2010
Сообщений: 194
По умолчанию

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

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

http://fayloobmennik.net/453516
вот, чтоб было понятно, что там рисуется)
"Думаешь, будет трудно? Конечно, будет! Но, только закаляя дух, людьми становятся люди!"
A-IX-2 вне форума Ответить с цитированием
Старый 10.03.2011, 15:26   #5
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

а если просто поменять местами значения, в обратном порядке, разве не помогает? 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, 15:42   #6
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,281
По умолчанию

Вообще, на сколько я это понял, данные о давлении должны храниться в 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 в 16:12.
Sibedir вне форума Ответить с цитированием
Старый 10.03.2011, 16:02   #7
A-IX-2
Форумчанин
 
Аватар для A-IX-2
 
Регистрация: 08.10.2010
Сообщений: 101
По умолчанию

Цитата:
Сообщение от 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, 16:07   #8
A-IX-2
Форумчанин
 
Аватар для A-IX-2
 
Регистрация: 08.10.2010
Сообщений: 101
По умолчанию

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

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

Цитата:
Сообщение от 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 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Анимация в СИ !!! Ислам Помощь студентам 1 03.03.2011 08:42
анимация serj-07 Общие вопросы Delphi 17 10.01.2010 10:39
анимация в с++ True_girl Помощь студентам 7 01.03.2009 18:57
Анимация BuTeK1 Паскаль, Turbo Pascal, PascalABC.NET 0 19.01.2009 00:30
анимация волшебная Общие вопросы Delphi 0 17.12.2008 21:01