Общая структура файла модуля:
Unit < имя модуля >;
Interface // Открытый интерфейс модуля (могут помещаться списки подключаемых модулей, объявление типов, констант, переменных, функций и процедур, к которым будет доступ из других модулей)
Implementation // Реализация модуля (могут помещаться списки подключаемых модулей, объявление типов, констант, переменных, функций и процедур, к которым не будет доступа из других модулей)
Initialization // (Необязательный раздел – операторы выполняются один раз при первом обращении к модулю)
Finalization // (Необязательный раздел – операторы выполняются при любом завершении работы модуля)
End.
Рассмотрим теперь текст модуля с пустой формой:
UnitUnit1;
Interface // Открытый интерфейс модуля
Uses {Список подключаемых модулей}
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
Type {Объявление класса формы}
TForm1 = class (TForm)
Private // закрытый раздел класса
Public // открытый раздел класса
End;
VarForm 1: TForm1;
Implementation // Реализациямодуля
{$R *. dfm}
End.
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;
4.2 Код программы «Построение траектории броуновское движение»
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
ScrollBar1: TScrollBar;
StaticText1: TStaticText;
Button2: TButton;
Button3: TButton;
Bevel1: TBevel;
ColorDialog1: TColorDialog;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure initz;
procedure paint;
procedure ScrollBar1Change(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
x1,x2,y1,y2,time,tx,ty:integer;
implementation
{$R *.dfm}
procedure tform1.initz;
begin
tx:=136;
ty:=120;
x1:=tx;
y1:=ty;
canvas.MoveTo(x1,y1);
canvas.Pen.Color:=clblue;
canvas.Pen.Width:=3;
scrollbar1.SetParams(80,0,99);
time:=100-scrollbar1.Position;
timer1.Enabled:=false;
end;
procedure tform1.paint;
begin
x2:=random(bevel1.Width)+tx;
y2:=random(bevel1.Height)+ty;
canvas.LineTo(x2,y2);
canvas.Pen.color:=canvas.pen.color+1;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if not timer1.Enabled then
begin
timer1.Enabled:=true;
timer1.Interval:=time;
button1.Caption:='STOP!';
end else
begin
timer1.enabled:=false;
button1.Caption:='GO!';
end;
end;
procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
time:=100-scrollbar1.Position;
timer1.Interval:=time;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
initz;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
repaint;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
close;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
paint;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
if colordialog1.Execute then
canvas.Pen.color:=colordialog1.Color;
end;
end.
ЗАКЛЮЧЕНИЕ
В данной работе мною была освещена основная теория броуновского движения и история его открытия. Были рассмотрены вопросы моделирования броуновского движения на DELPFI, а также основная характеристика, преимущества и возможности данной среды программирования.
В итоге можно сказать, что изучение фракталов и хаоса, в нашем случае― это броуновское движение, открывает замечательные возможности, как в исследовании бесконечного числа приложений, так и в области чистой математики.
Архангельский А.Я. «Программирование в Delphi». Учебник по классическим версиям Delphi. – М.: ООО «Бином-Пресс», 2006
Барлет М.С. «Введение в теория случайных процессов»
Булинский А.В., Ширяев А.Н. «Теория случайных процессов». ―М.:
ФИЗМАТЛИТ, 2005 г
Кроновер Р.М. «Фракталы и хаос в динамических системах. Основы теории». Москва: Постмаркет, 2000 г.
Миллер Б.М., Панков А.Р. « Теория случайных процессов»
«Немного о фракталах» http://edu.ioffe.ru