![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 посоветуйте как нарисовать процесс образования пузырьков пара в сосуде. 3х мерное рисование не нужно, хотя бы на плоскости. 
		
	
		
		
		
		
		
	
		
		
	
	
	догадываюсь, что проще всего работать с канвами, пузырьки представить в виде кругов. не знаю как сделать следующее: как программно организовать процесс создания и уничтожения этих самых кругов, и как сделать так чтобы скорость движения у каждого круга была различной. проще говоря пытаюсь получить чтото похожее на это - http://www.kernenergie.de/mediapool/...eactor_1_2.exe спасибо.  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Пример прикольный. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	А по задаче наверное так. Если отбросить физику самого процесса, то визуально выглядит, так: От днища сосуда отделяется полукруг который быстро увеличиваясь в диаметре приобретает форму круга, затем ускоряясь движется вертикально вверх, по достижении поверхности несколько сплющивается снизу и сверху. По достижении скажем половины радиуса круга над поверхностью выводится уже не круг а уменьшающийся в диаметре сектор в половину круга. Наверное так.  | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 именно так. с полукругами даже не обязательно. главное показать суть процесса. только вот не знаю как создать массив кругов(пузырьков) 
		
	
		
		
		
		
		
	
		
		
	
	
	по идее чтото вроде этого должно form1.Canvas.Create.Ellipse(); но точно не знаю.может подскажите где прочитать можно на такую тему.  | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Пузыри нарисовать - не самое сложное. Тут надо еще сам процесс нагрева жидкости сделать, т.к. кипение начинается по достижении некоторой критической точки - появление первого пузыря, а затем вплоть до пика разогрева будет увеличение количества пузырей. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Вам надо сначала сделать некий объект-пузырь, в одном экземпляре, который будет зарождаться в точке Х,У двигаться к точке Х1,У1 с увеличивающейся скоростью и трансформироваться в этой точке. Когда вы сделаете это с одним пузырем, дальнейшее сделать будет несложно.  | 
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 если быть точнее, то кипение начинается не с критической точки, а при достижении температуры насыщения, но это позже буду делать. 
		
	
		
		
		
		
		
	
		
		
	
	
	для меня всё как раз наоборот.. самое сложное это рисование. проблема в том что один пузырь я нарисовал, но мне нужно получить чтото вроде облака или массива всплывающих пузырей, как это сделать? рисовать каждый пузырь по отдельности это не выход...вдруг их надо будет сотня... я уже спрашивал у преподов-програмеров в универе,но если пишу тут, то понятно что они ответили ![]()  | 
| 
		 
			 
			#6  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 А, собственно, это так и делается. в упрощенном виде - массив объектов-пузырей, по которому пробегается некоторый контроллер и запускает у каждого соответсвующий метод.  | 
| 
		 
			 
			#7  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 а где это найти можно? отправьте меня куда следует. 
		
	
		
		
		
		
		
	
		
		
	
	
	задача вроде не сильно сложная, может гдето подобное есть. я пока не нашёл, уже 50 страниц с темами пролистал. может задачу проще объяснить... есть облако на небе, из него капают капли, как это нарисовать в делфи?  | 
| 
		 
			 
			#8  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Последний раз редактировалось Страдалецъ, 18.06.2009 в 13:11.  | 
| 
		 
			 
			#9  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 заранее спасибо) 
		
	
		
		
		
		
		
	
		
		
	
	
	только с депозита скачка это вечная проблема. если не затруднит можно на мыло скинуть nikishin_v[собака]mail.net  | 
| 
		 
			 
			#10  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Теперь только поздно вечером, а в чем проблема с депозита качать?  
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Вы попробуйте, там исполняемый файл - посмотрите, может не так что-то. Кстати, интересный глючок обнаружился. Делал в Висте, а на XP почему-то не отображается температурная закраска. ![]()  | 
| 
		 
			 
			#11  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 дело в том что мой айпишник динамический, поэтому трудно словить момент когда никто из моих соседей по сетке не качает... 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#12  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Понятно, отправил на мыло. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#13  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Цитата: 
	
   теперь хочется посмотреть на код   ,и потихоньку начать усложнять под мои задачи. | 
| 
		 
			 
			#14  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Код смогу выложить только часиков после 23-00. 
		
	
		
		
		
		
			
		
		
		
		
		
			Кстати: Цитата: 
	
 ![]() Последний раз редактировалось Страдалецъ, 18.06.2009 в 18:45.  | 
| 
		 
			 
			#15  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Выкладываю исходняк. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Код: 
	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.Код: 
	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 |