Построение траектории Броуновского движения
4.1 Код программы «Броуновское движение, как хаотичное движение частиц»
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, math;
type
TForm1 = class(TForm)
Label1: TLabel;
GroupBox1: TGroupBox;
Label2: TLabel;
Edit1: TEdit;
Button1: TButton;
Label3: TLabel;
Edit2: TEdit;
Label4: TLabel;
Edit3: TEdit;
Panel1: TPanel;
PaintBox: TPaintBox;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure GetData;
end;
Molecula = record
x, y:Integer; // координаты частицы
Vx, Vy: Integer; // составляющие скорости
angle: real; // угол полета
speed: byte;
end;
var
Form1: TForm1;
R, Vmax, n: integer;
mol: array [1..100] of molecula;
run: boolean;
implementation
{$R *.dfm}
procedure TForm1.GetData;
begin
R:=strtoint(Edit1.Text); // радиус чистицы
Vmax:=strtoint(Edit2.Text); // максимальная скорость движения
n:=strtoint(Edit3.Text); // количество частиц
end;
procedure TForm1.Button1Click(Sender: TObject);
var i, j: byte;
temp: integer;
begin
GetData;
// запуск движения
PaintBox.Refresh;
PaintBox.Canvas.Brush.Color:=clBlack;
PaintBox.Canvas.Pen.Color:=clBlack;
PaintBox.Canvas.Rectangle(0,0,400,400);
PaintBox.Canvas.Brush.Color:=clBlue;
PaintBox.Canvas.Pen.Color:=clBlue;
Randomize;
// определение начального положения частиц
for i:=1 to N do
begin
// начальные координаты
mol[i].x:=RandomRange(R, PaintBox.Width-R);
mol[i].y:=RandomRange(R, PaintBox.Height-R);
// начальное направление движения
mol[i].angle:=Random(360)*Pi/180;
mol[i].speed:=RandomRange(1, Vmax);
// cоставляющие движения частицы по осям
mol[i].Vx := Round(mol[i].speed * Sin(mol[i].angle));
mol[i].Vy := Round(mol[i].speed * Cos(mol[i].angle));
// вывод на экран
PaintBox.Canvas.Ellipse(mol[i].x-R, mol[i].y-R, mol[i].x+R, mol[i].y+R);
end;
Run:=True;
repeat
for i:=1 to N do
begin
// стираем молекулу
PaintBox.Canvas.Brush.Color:=clBlack;
PaintBox.Canvas.Pen.Color:=clBlack;
PaintBox.Canvas.Ellipse(mol[i].x-R, mol[i].y-R, mol[i].x+R, mol[i].y+R);
// обработка столкновения
for j:=1 to n do
if j<>i then
begin
// определяем столкновение молекулы
if sqrt(sqr(mol[i].x-mol[j].x)+sqr(mol[i].y-mol[j].y))<2*R+1 then
begin
temp:=mol[i].Vx; mol[i].Vx:=mol[j].Vx; mol[j].Vx:=temp;
temp:=mol[i].Vy; mol[i].Vy:=mol[j].Vy; mol[j].Vy:=temp;
end;
end;
// сдвигаем на новую позицию.
mol[i].x:=mol[i].x+mol[i].Vx;
mol[i].y:=mol[i].y+mol[i].Vy;
// проверка на выход за границы области
if mol[i].x>PaintBox.Width-R then
begin
mol[i].x:=PaintBox.Width-R;
mol[i].Vx:=-mol[i].Vx;
end;
if mol[i].x<R then
begin
mol[i].x:=R;
mol[i].Vx:=-mol[i].Vx;
end;
if Mol[i].y>PaintBox.Height-R then
begin
mol[i].y:=PaintBox.Height-R;
mol[i].Vy:=-mol[i].Vy;
end;
if mol[i].y<R then
begin
mol[i].y:=R;
mol[i].Vy:=-Mol[i].Vy;
end;
// вывод на экран
PaintBox.Canvas.Brush.Color:=clBlue;
PaintBox.Canvas.Pen.Color:=clBlue;
PaintBox.Canvas.Ellipse(mol[i].x-R, mol[i].y-R, mol[i].x+R, mol[i].y+R);
Application.ProcessMessages;
end;
sleep(5);
Application.ProcessMessages;
if run=false then break;
until false;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Run:=False;
end;
end.
{
// temp:=mol[i].Vx; mol[i].Vx:=mol[j].Vx; mol[j].Vx:=temp;
// temp:=mol[i].Vy; mol[i].Vy:=mol[j].Vy; mol[j].Vy:=temp;
// Random(360)*Pi/180;
mol[j].angle:=360*Pi-mol[j].angle;
// temp:=mol[i].angle; mol[i].angle:=mol[j].angle; mol[j].angle:=temp;
// cоставляющие движения частицы по осям
mol[j].Vx := Round(mol[j].speed * Sin(mol[j].angle));
mol[j].Vy := Round(mol[j].speed * Cos(mol[j].angle));
mol[i].angle:=360*Pi-mol[i].angle;
// cоставляющие движения частицы по осям
mol[i].Vx := Round(mol[i].speed * Sin(mol[i].angle));
mol[i].Vy := Round(mol[i].speed * Cos(mol[i].angle));
// сдвигаем на новую позицию.
mol[i].x:=mol[i].x+mol[i].Vx;
mol[i].y:=mol[i].y+mol[i].Vy;
//mol[j].Vx:=mol[j].Vx+mol[i].Vx;
// mol[j].Vy:=mol[j].Vy+mol[i].Vy;