Построение траектории Броуновского движения

курсовая работа

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;

Делись добром ;)