Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.06.2009, 22:45
Аватар для Sevas
Sevas Sevas вне форума
Прохожий
 
Регистрация: 17.06.2009
Сообщения: 20
Репутация: 10
По умолчанию Рисование процесса кипения

посоветуйте как нарисовать процесс образования пузырьков пара в сосуде. 3х мерное рисование не нужно, хотя бы на плоскости.
догадываюсь, что проще всего работать с канвами, пузырьки представить в виде кругов.
не знаю как сделать следующее:
как программно организовать процесс создания и уничтожения этих самых кругов, и как сделать так чтобы скорость движения у каждого круга была различной.

проще говоря пытаюсь получить чтото похожее на это - http://www.kernenergie.de/mediapool/...eactor_1_2.exe
спасибо.
Ответить с цитированием
  #2  
Старый 17.06.2009, 23:13
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Пример прикольный.
А по задаче наверное так. Если отбросить физику самого процесса, то визуально выглядит, так: От днища сосуда отделяется полукруг который быстро увеличиваясь в диаметре приобретает форму круга, затем ускоряясь движется вертикально вверх, по достижении поверхности несколько сплющивается снизу и сверху. По достижении скажем половины радиуса круга над поверхностью выводится уже не круг а уменьшающийся в диаметре сектор в половину круга.
Наверное так.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 17.06.2009, 23:22
Аватар для Sevas
Sevas Sevas вне форума
Прохожий
 
Регистрация: 17.06.2009
Сообщения: 20
Репутация: 10
По умолчанию

именно так. с полукругами даже не обязательно. главное показать суть процесса. только вот не знаю как создать массив кругов(пузырьков)
по идее чтото вроде этого должно

form1.Canvas.Create.Ellipse();
но точно не знаю.может подскажите где прочитать можно на такую тему.
Ответить с цитированием
  #4  
Старый 18.06.2009, 00:49
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Пузыри нарисовать - не самое сложное. Тут надо еще сам процесс нагрева жидкости сделать, т.к. кипение начинается по достижении некоторой критической точки - появление первого пузыря, а затем вплоть до пика разогрева будет увеличение количества пузырей.
Вам надо сначала сделать некий объект-пузырь, в одном экземпляре, который будет зарождаться в точке Х,У двигаться к точке Х1,У1 с увеличивающейся скоростью и трансформироваться в этой точке. Когда вы сделаете это с одним пузырем, дальнейшее сделать будет несложно.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 18.06.2009, 01:08
Аватар для Sevas
Sevas Sevas вне форума
Прохожий
 
Регистрация: 17.06.2009
Сообщения: 20
Репутация: 10
По умолчанию

если быть точнее, то кипение начинается не с критической точки, а при достижении температуры насыщения, но это позже буду делать.
для меня всё как раз наоборот.. самое сложное это рисование. проблема в том что один пузырь я нарисовал, но мне нужно получить чтото вроде облака или массива всплывающих пузырей, как это сделать?
рисовать каждый пузырь по отдельности это не выход...вдруг их надо будет сотня...
я уже спрашивал у преподов-програмеров в универе,но если пишу тут, то понятно что они ответили
Ответить с цитированием
  #6  
Старый 18.06.2009, 01:39
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Sevas
для меня всё как раз наоборот.. самое сложное это рисование. проблема в том что один пузырь я нарисовал, но мне нужно получить чтото вроде облака или массива всплывающих пузырей, как это сделать?
рисовать каждый пузырь по отдельности это не выход...вдруг их надо будет сотня...
я уже спрашивал у преподов-програмеров в универе,но если пишу тут, то понятно что они ответили

А, собственно, это так и делается. в упрощенном виде - массив объектов-пузырей, по которому пробегается некоторый контроллер и запускает у каждого соответсвующий метод.
Ответить с цитированием
  #7  
Старый 18.06.2009, 01:48
Аватар для Sevas
Sevas Sevas вне форума
Прохожий
 
Регистрация: 17.06.2009
Сообщения: 20
Репутация: 10
По умолчанию

а где это найти можно? отправьте меня куда следует.
задача вроде не сильно сложная, может гдето подобное есть. я пока не нашёл, уже 50 страниц с темами пролистал.

может задачу проще объяснить...
есть облако на небе, из него капают капли, как это нарисовать в делфи?
Ответить с цитированием
  #8  
Старый 18.06.2009, 02:47
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Ну вот я наваял что-то похожее:
http://depositfiles.com/files/e2eozwg1y
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 18.06.2009 в 13:11.
Ответить с цитированием
  #9  
Старый 18.06.2009, 13:36
Аватар для Sevas
Sevas Sevas вне форума
Прохожий
 
Регистрация: 17.06.2009
Сообщения: 20
Репутация: 10
По умолчанию

заранее спасибо)
только с депозита скачка это вечная проблема. если не затруднит можно на мыло скинуть
nikishin_v[собака]mail.net
Ответить с цитированием
  #10  
Старый 18.06.2009, 15:10
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Теперь только поздно вечером, а в чем проблема с депозита качать?
Вы попробуйте, там исполняемый файл - посмотрите, может не так что-то.
Кстати, интересный глючок обнаружился. Делал в Висте, а на XP почему-то не отображается температурная закраска.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #11  
Старый 18.06.2009, 17:16
Аватар для Sevas
Sevas Sevas вне форума
Прохожий
 
Регистрация: 17.06.2009
Сообщения: 20
Репутация: 10
По умолчанию

дело в том что мой айпишник динамический, поэтому трудно словить момент когда никто из моих соседей по сетке не качает...
Ответить с цитированием
  #12  
Старый 18.06.2009, 17:46
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Понятно, отправил на мыло.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #13  
Старый 18.06.2009, 18:23
Аватар для Sevas
Sevas Sevas вне форума
Прохожий
 
Регистрация: 17.06.2009
Сообщения: 20
Репутация: 10
Хорошо

Цитата:
Сообщение от Страдалецъ
Ну вот я наваял что-то похожее:
http://depositfiles.com/files/e2eozwg1y
супер, очень похоже.просто и сердито.
теперь хочется посмотреть на код ,и потихоньку начать усложнять под мои задачи.
Ответить с цитированием
  #14  
Старый 18.06.2009, 18:33
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Код смогу выложить только часиков после 23-00.
Кстати:
Цитата:
рисовать каждый пузырь по отдельности это не выход...вдруг их надо будет сотня...
У меня их там около 200 штук в пике наблюдается, и ничего - пузырятся.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 18.06.2009 в 18:45.
Ответить с цитированием
  #15  
Старый 18.06.2009, 23:43
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Выкладываю исходняк.
Код:
unit Unit27;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Buttons, StdCtrls, ToolWin, ActnMan, ActnCtrls, ActnList, PlatformDefaultStyleActnCtrls, ComCtrls;

type
  TBubble = class
   Size: TPoint;
   Pos: TPoint;
   constructor Create;
   procedure PullUp;
   procedure Paint;
   procedure Free;
  end;

  TForm27 = class(TForm)
    PaintBox1: TPaintBox;
    Button1: TButton;
    BubbleTimer: TTimer;
    Label1: TLabel;
    TrackBar1: TTrackBar;
    HotTimer: TTimer;
    Label2: TLabel;
    procedure PaintBox1Paint(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure BubbleTimerTimer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure HotTimerTimer(Sender: TObject);
  private
    ABubbles: Array of TBubble;
  end;

Const H = 400;
      W = 400;
      D = 10;
      PX = 50;
      PY = 50;
      T = 1;
      R = 25;
var
  Form27: TForm27;

implementation

{$R *.dfm}

procedure TForm27.Button1Click(Sender: TObject);
begin
 if Button1.Caption = 'Выкл.'
 then begin
      PaintBox1.Canvas.Brush.Color := clBlack;
      Button1.Caption := 'Вкл.';
      TrackBar1.Position := 20;
      end
 else begin
      PaintBox1.Canvas.Brush.Color := clRed;
      Button1.Caption := 'Выкл.';
      TrackBar1.Position := 100;
      end;
 PaintBox1.Canvas.Brush.Style := bsSolid;
 PaintBox1.Canvas.FillRect(Rect(PX,PY+H+3*D,PX+W+4*D,PY+H+4*D));
end;

procedure TForm27.FormCreate(Sender: TObject);
begin
 SetLength(ABubbles, 0);
end;

procedure TForm27.HotTimerTimer(Sender: TObject);
begin
 if TrackBar1.SelEnd > TrackBar1.Position
 then TrackBar1.SelEnd := TrackBar1.SelEnd - 1
 else TrackBar1.SelEnd := TrackBar1.SelEnd + 1;
 if TrackBar1.Position = TrackBar1.SelEnd
 then HotTimer.Enabled := False;
 Label2.Caption := IntToStr(TrackBar1.SelEnd)+#$B0;
end;

procedure TForm27.PaintBox1Paint(Sender: TObject);
begin
 // Кастрюлька
 PaintBox1.Canvas.Pen.Width := T;
 PaintBox1.Canvas.Pen.Color := clBlack;
 PaintBox1.Canvas.MoveTo(PX,PY);
 PaintBox1.Canvas.LineTo(PX+D,PY+D);
 PaintBox1.Canvas.LineTo(PX+D,PY+H+D);
 PaintBox1.Canvas.LineTo(PX+2*D,PY+H+2*D);
 PaintBox1.Canvas.LineTo(PX+2*D+W,PY+H+2*D);
 PaintBox1.Canvas.LineTo(PX+3*D+W,PY+H+D);
 PaintBox1.Canvas.LineTo(PX+3*D+W,PY+D);
 PaintBox1.Canvas.LineTo(PX+4*D+W,PY);

 PaintBox1.Canvas.LineTo(PX+3*D+W,PY);
 PaintBox1.Canvas.LineTo(PX+2*D+W,PY+D);
 PaintBox1.Canvas.LineTo(PX+2*D+W,PY+H+D);
 PaintBox1.Canvas.LineTo(PX+2*D,PY+H+D);
 PaintBox1.Canvas.LineTo(PX+2*D,PY+D);
 PaintBox1.Canvas.LineTo(PX+D,PY);
 PaintBox1.Canvas.LineTo(PX,PY);

 PaintBox1.Canvas.Brush.Style := bsBDiagonal;
 PaintBox1.Canvas.Brush.Color := clRed;
 PaintBox1.Canvas.FloodFill(PX+D+T+1,PY+D,clBlack,fsBorder);
 // Жидкость
 PaintBox1.Canvas.Brush.Style := bsSolid;
 PaintBox1.Canvas.Brush.Color := clAqua;
 PaintBox1.Canvas.FillRect(Rect(PX+2*D+T,PY+3*D-T,PX+W+2*D,PY+H+D));
 // Плитка
 PaintBox1.Canvas.Brush.Style := bsSolid;
 PaintBox1.Canvas.Brush.Color := clBlack;
 PaintBox1.Canvas.FillRect(Rect(PX,PY+H+3*D,PX+W+4*D,PY+H+4*D));
end;

procedure TForm27.TrackBar1Change(Sender: TObject);
begin
 HotTimer.Enabled := True;
end;

procedure TForm27.BubbleTimerTimer(Sender: TObject);
Var i,n: Integer;
begin
 Randomize;
 for i := 0 to Length(ABubbles)-1
 do ABubbles[i].PullUp;
 if TrackBar1.SelEnd > 40
 then case Random(TrackBar1.Max - TrackBar1.SelEnd)
      of 0: begin
            SetLength(ABubbles, Length(ABubbles)+1);
            ABubbles[High(ABubbles)] := TBubble.Create;
            ABubbles[High(ABubbles)].Pos := Point(PX+2*D+Random(W-R),PY+H+D);
            ABubbles[High(ABubbles)].Paint;
            end;
      end;

 i := 0;
 while i <= Length(ABubbles)-1
 do begin
    if ABubbles[i].Pos.Y < PX+2*D+T+R
    then begin
         ABubbles[i].Free;
         for n := i+1 to Length(ABubbles)-1
         do ABubbles[n-1] := ABubbles[n];
         SetLength(ABubbles,Length(ABubbles)-1);
         end;
    Inc(i);
    end;
 Label1.Caption := Format('Напузыряли: %d',[Length(ABubbles)]);
end;

constructor TBubble.Create;
begin
 Size := Point(0,0);
 inherited;
end;

procedure TBubble.Free;
begin
 Paint;
 inherited;
end;

procedure TBubble.Paint;
begin
 Form27.PaintBox1.Canvas.Pen.Width := 1;
 Form27.PaintBox1.Canvas.Pen.Mode := pmXor;
 Form27.PaintBox1.Canvas.Pen.Color := clRed;
 Form27.PaintBox1.Canvas.Brush.Style := bsClear;
 Form27.PaintBox1.Canvas.Ellipse(Pos.X,Pos.Y-Size.Y,Pos.X+Size.X,Pos.Y);
end;

procedure TBubble.PullUp;
begin
 Paint;
 Dec(Pos.Y,2);
 if Size.X < R then Inc(Size.X);
 if Size.Y < R then Inc(Size.Y);
 Paint;
end;

end.
и dfm-файл
Код:
object Form27: TForm27
  Left = 0
  Top = 0
  Caption = 'Form27'
  ClientHeight = 584
  ClientWidth = 649
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object PaintBox1: TPaintBox
    Left = 8
    Top = 8
    Width = 537
    Height = 497
    Color = clWhite
    ParentColor = False
    OnPaint = PaintBox1Paint
  end
  object Label1: TLabel
    Left = 551
    Top = 56
    Width = 75
    Height = 13
    Caption = #1053#1072#1087#1091#1079#1099#1088#1103#1083#1080': 0'
  end
  object Label2: TLabel
    Left = 546
    Top = 517
    Width = 17
    Height = 13
    Caption = '20'#176
  end
  object Button1: TButton
    Left = 240
    Top = 551
    Width = 75
    Height = 25
    Caption = #1042#1082#1083'.'
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clHighlight
    Font.Height = -11
    Font.Name = 'Tahoma'
    Font.Style = []
    ParentFont = False
    TabOrder = 0
    OnClick = Button1Click
  end
  object TrackBar1: TTrackBar
    Left = 8
    Top = 505
    Width = 537
    Height = 45
    Max = 100
    Frequency = 5
    Position = 20
    SelEnd = 20
    TabOrder = 1
    TickMarks = tmBoth
    OnChange = TrackBar1Change
  end
  object BubbleTimer: TTimer
    Interval = 20
    OnTimer = BubbleTimerTimer
    Left = 560
    Top = 16
  end
  object HotTimer: TTimer
    Enabled = False
    Interval = 250
    OnTimer = HotTimerTimer
    Left = 560
    Top = 80
  end
end
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:50.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter