Имитационная модель программы.

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

  Оператор
  Монитор
Панель управления
Всплывающее меню
Главное меню
Форма с моделированием движения робота
Форма «О разработчике»
Форма «О программе»
Форма Помощник
Форма с графиками и таблицами

Разработка математической модели.

3.1 Прямоугольный несимметричный с нулевым участком.

Чтобы исследовать все характеристики рассматриваемого закона движения, рассмотрим его в аналитической форме.

Рассмотрим прямой ход ползуна, соответствующий перемещению Sm. Время ti изменяется в следующих пределах:

1) 0 ≤ ti ≤ t1;

2) t1 ≤ ti ≤ t2;

3) t2 ≤ ti ≤ Tf.

Рассмотрим закон постоянного ускорения:

1) f1II (k) = 2/k1(1-k1+k2);

2) f2II(k) = 0;

3) f3II(k) = (-2)/(1-k1)(1-k1+k2).

Интегрируя дважды выражение для (1) участка, получаем выражения для f1I(k) и f1(k):

f1I(k) = ∫ f1II (k)dk = ∫2dk/k1(1-k1+k2) = 2k/k1(1-k1+k2) + C1;

f1(k) = ∫ f1I (k)dk = ∫(2k/k1(1-k1+k2) + C1)dk = (k^2)/k1(1-k1+k2) + C1*k + C2.

Начальные условия: при k = 0, f1I(k) = 0, f1(k) = 0 =>C1 = C2 = 0.

f1I(k) = 2k/k1(1-k1+k2), f1(k) = (k^2)/k1(1-k1+k2).

Заменяяk=ti/Tf, k1=t1/Tfиk2=t2/Tfи домножая функции на коэффициенты, получаем выражения для a1(ti), V1(ti) и S1(ti):

a1(ti) = (Sm/Tf^2) * 2Tf/(t1*(Tf-t1+t2));

V1(ti) = (Sm/Tf) * 2ti/(t1*(Tf-t1+t2));

S1(ti) = Sm * ti/(Tf*ti*(Tf-t1+t2)).

Интегрируя дважды выражение для (2) участка, получаем выражения для f2I(k) и f2(k):

f2I(k) = ∫ f2II (k)dk = C1;

f2(k) = ∫ f2I (k)dk = C1*k + C2.

Граничные условия: при k=k1, f2I(k) = f1I(k), f2(k) = f1(k)=>

C1 = 2/(1-k1+k2), C2 = k1/(1-k1+k2) – 2k1/(1-k1+k2) = -k1/(1-k1+k2).

f2I(k) = 2/(1-k1+k2), f2(k) = 2k/(1-k1+k2) – k1 /(1-k1+k2) = (2k-k1)/(1-k1+k2).

Заменяяk=ti/Tf, k1=t1/Tfиk2=t2/Tfи домножая функции на коэффициенты, получаем выражения для a2(ti), V2(ti) и S2(ti):

a2(ti) = 0;

V2(ti) = (Sm/Tf) * 2Tf/(Tf-t1+t2);

S2(ti) = Sm * (2ti-t1)/(Tf-t1+t2).

Интегрируя дважды выражение для (3) участка, получаем выражения для f3I(k) и f3(k):

f3I(k) = ∫ f3II (k)dk = ∫(-2dk)/(1-k1)(1-k1+k2) = (-2k)/(1-k1)(1-k1+k2) + C1;

f3(k) = ∫ f3I (k)dk = ∫ [(-2k)/(1-k1)(1-k1+k2) + C1]dk = (-k^2)/(1-k1)*(1-k1+k2) +

+ C1*k + C2.

Граничные условия: при k=1, f3I(k)=0, f3(k)=1 =>

C1 = 2/(1-k1)(1-k1+k2), C2 = 1 + 1/(1-k1)(1-k1+k2) – 2/(1-k1)(1-k1+k2) =

= [(1-k1)(1-k1+k2) – 1]/(1-k1)(1-k1+k2).

f3I(k) = (-2k+2)/(1-k1)(1-k1+k2);

f3(k) = [-(k^2) + 2k + (1-k1)(1-k1+k2) – 1]/(1-k1)(1-k1+k2).

Заменяяk=ti/Tf, k1=t1/Tfиk2=t2/Tfи домножая функции на коэффициенты, получаем выражения для a3(ti), V3(ti) и S3(ti):

a3(ti) = (Sm/Tf^2) * (-2Tf)/(Tf-t1)(Tf-t1+t2) ;

V3(ti) = (Sm/Tf) * (-2ti + 2Tf)/(Tf-t1)(Tf-t1+t2);

S3(ti) = Sm * [-ti^2 + 2ti*Tf +Tf(Tf-t1)(Tf-t1+t2)-Tf^2]/Tf(Tf-t1)(Tf-t1+t2).

3.2. Косинусоидальный симметричный.

Чтобы исследовать все характеристики рассматриваемого закона движения, рассмотрим его в аналитической форме.

Рассмотрим прямой ход ползуна, соответствующий перемещению Sm. Время ti изменяется в пределе: 0 ≤ ti≤Tf.

Вторая производная от функции имеет вид:

fII(k) = (0,5*π^2)*cosπk.

Интегрируя дваждыданное выражение, получаем выражения для fI(k) и f(k):

fI(k) = ∫ fII(k)dk = ∫ (0,5*π^2)*cosπkdk = (0,5*π)*sinπk + C1;

f(k) = ∫ fI(k)dk = ∫ [(0,5*π)*sinπk + C1]dk = -0,5*cosπk + C1*k + C2.

Начальные условия: при k=0, fI(k)=0, fI(k)=0 =>C1=0, C2=0,5.

fI(k) = (0,5*π)*sinπk, f(k) = 0,5*(1 – cosπk).

Заменяяk=ti/Tfи домножая функции на коэффициенты, получаем выражения для a(ti), V(ti) и S(ti):

a(ti) = (Sm/Tf^2) * (0,5*π^2)*cos(π*ti/Tf);

V(ti) = (Sm/Tf) * (0,5*π)*sin(π*ti/Tf);

S(ti) = Sm * 0,5*(1 – cos(π*ti/Tf)).

3.3. Равноубывающий симметричный.

Чтобы исследовать все характеристики рассматриваемого закона движения, рассмотрим его в аналитической форме.

Рассматривается поворот схвата, соответствующий угловому перемещению φm. Время изменяется в пределах 0 ≤ ti ≤ Tf.

Вторая производная от функции имеет вид:

fII(k) = 6(1-2k).

Интегрируя дваждыданное выражение, получаем выражения для fI(k) и f(k):

fI(k) = ∫ fII(k)dk = ∫ 6(1-2k)dk = 6k – 6k^2 + C1;

f(k) = ∫ fI(k)dk = ∫ (6k – 6k^2 + C1)dk = 3k^2 – 2k^3 + C1*k + C2.

Начальные условия: при k=0, fI(k)=0, f(k)=0 =>C1=C2=0.

fI(k) = 6k * (1-k), f(k) = (k^2) * (3-2k).

Заменяяk=ti/Tfи домножая функции на коэффициенты, получаем выражения для a(ti), V(ti) и S(ti):

a(ti) = (Sm/Tf^2) * 6(1-(ti/Tf));

V(ti) = (Sm/Tf) * [6ti*(Tf-ti)]/Tf;

S(ti) = Sm * [(ti^2)*(3*(Tf^2)-2ti*Tf)].

Иерархия классов.

Класс TZvenoявляется абстрактным классом-родителем для классов TMOnward (класс «поступательное звено») и TMRotate (класс «вращательное звено»).Класс TMRobotявляется классом-контейнером, полями которого являются поступательные и вращательные звенья.

Класс TLaw_Commonявляется абстрактным классом-родителем для классов законов движений звеньев: TLawA4, TLawB5 и TLawC8.Класс TLaw_movementявляется классом-контейнером, полями которого являются законы движения звеньев.

TZveno Поля: FX, FY, FX0, FY0, FColor; Конструктор: constructor create; Деструктор: destructor Destroy; Методы: SetColor, SetX, SetY, SetX0, SetY0, Paint, Move; Свойства: X, Y, X0, Y0, Color.
TMOnward Поля: FX, FY, FX0, FY0, FColor, FWidth, FHeight, FPostHeight; Конструктор: constructor create; Деструктор: destructor Destroy; Методы: SetWidth, SetHeight, SetPostHeight, SetColor, SetX, SetY, SetX0, SetY0, Paint, Move; Свойства: X, Y, X0, Y0, Color, Width, Height, PostHeight.
TMRotate Поля: FX, FY, FX0, FY0, FColor,FLength, FRadius, FФ0, FФ; Конструктор: constructor create; Деструктор: destructor Destroy; Методы: SetLength, SetRadius, SetFi0, SetFi, SetColor, SetX, SetY, SetX0, SetY0, Paint, Move; Свойства: X, Y, X0, Y0, Color, Length, Radius, Fi0, Fi.
TMRobot Поля: MOnwardA, MOnwardB, MRotateC, FX, FY, FX0, FY0, FColor, FWidth, FHeight, FPostHeight, FLength, FRadius, FФ0, FФ, FTimer, FBitmap; Конструктор: constructor create; Деструктор: destructor Destroy; Методы: SetColor, SetX, SetY, SetX0, SetY0, Paint, Move, SetLength, SetRadius, SetFi0, SetFi,SetWidth, SetHeight, SetPostHeight, Start, Stop; Свойства: X, Y, X0, Y0, Color, Length, Radius, Fi0, Fi, Width, Height, PostHeight.

TLaw_Common Поля: CTf, Cti, CN, Cni, Ct1, Ct2; Конструктор: constructor create; Деструктор: destructor Destroy; Методы: SetTf, SetN, Sett1, Sett2; Свойства: Tf, N. t1, t2.
TLawC8 Поля: CTf, Cti, CN, Cni, CFimin, CFimax; Конструктор: constructor create; Деструктор: destructor Destroy; Методы: SetTf, SetN, SetFimax, SetFimin, e, w, fi; Свойства: Tf, N,Fimax, Fimin.
TLawA4 Поля: CTf, Cti, CN, Cni, Ct1, Ct2, CSm; Конструктор: constructor create; Деструктор: destructor Destroy; Методы: SetTf, SetN, Sett1, Sett2, SetSm, a, v, s; Свойства: Tf, N. t1, t2, Sm.
TLawB5 Поля: CTf, Cti, CN, Cni, CSm; Конструктор: constructor create; Деструктор: destructor Destroy; Методы: SetTf, SetN, SetSm, a, v, s; Свойства: Tf, N,Sm.
TLaw_movement Поля: CTf, Cti, CN, Cni, Ct1, Ct2, CSm, CFimax, CFimin; Конструктор: constructor create; Деструктор: destructor Destroy; Методы: SetTf, SetN, Sett1, Sett2, SetFimax, SetFimin, SetSm, a, v, s, e, w, fi; Свойства: Tf, N. t1, t2, Fimax, Fimin, Sm.  

Исходный код программы.

unit Unit1; //Главная форма (Монитор)

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Menus, ComCtrls, RUnit, shellapi;

procedure ShowLogo(Handle:THandle)stdcall;

type

TForm1 = class(TForm)

MainMenu1: TMainMenu;

PopupMenu1: TPopupMenu;

N1: TMenuItem;

N2: TMenuItem;

N3: TMenuItem;

N4: TMenuItem;

N5: TMenuItem;

N6: TMenuItem;

N7: TMenuItem;

N8: TMenuItem;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Button4: TButton;

btn2: TButton;

procedure FormCreate(Sender: TObject);

procedure N8Click(Sender: TObject);

procedure N4Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure btn2Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure N1Click(Sender: TObject);

procedure N3Click(Sender: TObject);

procedure N5Click(Sender: TObject);

procedure N7Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure N2Click(Sender: TObject);

procedure N6Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

procedure ShowLogo; external 'Project.dll' index 11; //вызовЗаставкиизбиблиотеки

procedure ShowProg; external 'Project.dll' index 12; //вызов «Опрограмме» избиблиотеки

procedure ShowDev; external 'Project.dll' index 13; //вызов «Оразработчике» избиблиотеки

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

begin

Form1.Visible:=False;

ShowLogo(Handle); //Появление Заставки при создании Главной формы

end;

procedure TForm1.N8Click(Sender: TObject);

begin

Form1.Close; //ЗакрытиеГлавной формы

end;

procedure TForm1.N4Click(Sender: TObject);

begin

Form1.Close;

end;

procedure TForm1.Button4Click(Sender: TObject);

begin

Form1.Close;

end;

procedure TForm1.btn2Click(Sender: TObject);

begin

Form3.Show; //Открывается форма с роботом

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

ShowProg; //Открывается форма «О программе»

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

ShowDev; //Открывается форма «О разработчике»

end;

procedure TForm1.N1Click(Sender: TObject);

begin

ShowProg;

end;

procedure TForm1.N3Click(Sender: TObject);

begin

ShowDev;

end;

procedure TForm1.N5Click(Sender: TObject);

begin

ShowProg;

end;

procedure TForm1.N7Click(Sender: TObject);

begin

ShowDev;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

ShellExecute(0, nil, 'DelphiBeginner.chm', nil,nil, SW_SHOWNORMAL); {ОткрываетсяучебникDelphiдляначинающих, такназываемый «Помощник»}

end;

procedure TForm1.N2Click(Sender: TObject);

begin

ShellExecute(0, nil, 'DelphiBeginner.chm', nil,nil, SW_SHOWNORMAL);

end;

procedure TForm1.N6Click(Sender: TObject);

begin

ShellExecute(0, nil, 'DelphiBeginner.chm', nil,nil, SW_SHOWNORMAL);

end;

end.//конец Монитора

unitRUnit; //модульсроботом

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ClUnit, Math;

type

TForm3 = class(TForm)

Button1: TButton;

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Edit4: TEdit;

edt1: TEdit;

edt2: TEdit;

edt3: TEdit;

edt4: TEdit;

edt5: TEdit;

edt6: TEdit;

edt7: TEdit;

pnl1: TPanel;

procedure Button1Click(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

Robot : TMRobot;

Law_Movement:TLaw_Movement;

end;

var

Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin

Form1.Refresh;

Robot := TMRobot.Create;

Tf := StrToInt(Form1.edt4.Text);

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

Robot.Free;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

Robot:=TMRobot.Create(Self);

Robot.Parent:=pnl1;

end;

end. //конецмодуля

unit ClUnit; //модуль с описанием классов

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Math;

type

TLaw_Common = class //абстрактный класс-родитель для законов движения

CTf :Double; //времяфазы

Cti :double; //моментальное время (в данный момент)

CN :Integer; //количество участков

Cni :byte; //моментальный участок (в данный момент)

Ct1, Ct2 : Double; //коэффициенты

procedure SetTf(const Value: Double); virtual; abstract;

procedure SetN(const Value: Integer); virtual; abstract;

procedure Sett1(const Value: Double); virtual; abstract;

procedure Sett2(const Value: Double); virtual; abstract;

public

constructor Create;virtual; abstract; //конструктор

destructor Destroy; virtual; abstract; //деструктор

property Tf:Double read CTf write SetTf;

property N:Integer read CN write SetN;

property t1:Double read Ct1 write Sett1;

property t2:Double read Ct2 write Sett2;

end;

TLawA4 = class(TLaw_Common)

CTf : Double;

Cti : double;

CSm : Integer; //максимальноерасстояние

CN : Integer;

Cni : byte;

Ct1, Ct2 : Double;

procedure SetTf(const Value: Double); override;

procedure SetSm(const Value: Integer);

procedure SetN(const Value: Integer); override;

procedure Sett1(const Value: Double); override;

procedure Sett2(const Value: Double); override;

public

constructor Create;override;

destructor Destroy; override;

property Tf:Double read CTf write SetTf;

property Sm:Integer read CSm write SetSm;

property N:Integer read CN write SetN;

property t1:Double read Ct1 write Sett1;

property t2:Double read Ct2 write Sett2;

function a(Tf,t1,t2,ti:Double; Sm, N:Integer; ni:byte):Double; //ускорение

function v(Tf,t1,t2,ti:Double; Sm, N:Integer; ni:byte):Double; //скорость

function s(Tf,t1,t2,ti:Double; Sm, N:Integer; ni:byte):Double; //перемещение

end;

TLawB5 = class(TLaw_Common)

CTf : Double;

Cti : double;

CSm : Integer; //максимальноерасстояние

CN : Integer;

Cni : byte;

procedure SetTf(const Value: Double); override;

procedure SetSm(const Value: Integer);

procedure SetN(const Value: Integer); override;

public

constructor Create;override;

destructor Destroy; override;

property Tf:Double read CTf write SetTf;

property Sm:Integer read CSm write SetSm;

property N:Integer read CN write SetN;

function a(Tf,ti:Double; Sm, N:Integer; ni:byte):Double; //ускорение

function v(Tf,ti:Double; Sm, N:Integer; ni:byte):Double; //скорость

function s(Tf,ti:Double; Sm, N:Integer; ni:byte):Double; //перемещение

end;

TLawC8 = class(TLaw_Common)

CTf : Double;

Cti : double;

CФmax :Double; //максимальныйуголповорота

CФmin :Double;//минимальный угол поворота

CN :Integer;

Cni : byte;

procedure SetTf(const Value: Double); override;

procedure SetФmax(const Value: Double);

procedure SetФmin(const Value: Double);

procedure SetN(const Value: Integer); override;

public

constructor Create;override;

destructor Destroy; override;

property Tf:Double read CTf write SetTf;

propertyФmax:Double read CФmax write SetФmax;

propertyФmin:Double read CФmin write SetФmin;

property N:Integer read CN write SetN;

function e(Tf,ti,Фmax,CФmin:Double; N:Integer; ni:byte):Double; //угловоеускорение

function w(Tf,ti,Фmax,CФmin:Double; N:Integer; ni:byte):Double; //угловаяскорость

function ф(Tf,ti,Фmax,CФmin:Double; N:Integer; ni:byte):Double; //поворот

end;

TLaw_Movement = class (TObject) //класс-контейнер для законов движений

LawA4 : TLawA4;

LawB5 : TLawB5;

LawC8 : TLawC8;

CTf : Double;

Cti : double;

CSm : Integer;

CФmax :Double;

CФmin :Double;

CN :Integer;

Cni : byte;

Ct1, Ct2 : Double;

procedure SetTf(const Value: Double);

procedure SetФmax(const Value: Double);

procedure SetФmin(const Value: Double);

procedure SetN(const Value: Integer);

procedure Sett1(const Value: Double);

procedure Sett2(const Value: Double);

procedure SetN(const Value: Integer); override;

public

constructor Create;

destructor Destroy;

property Tf:Double read CTf write SetTf;

propertyФmax:Double read CФmax write SetФmax;

propertyФmin:Double read CФmin write SetФmin;

property Sm:Integer read CSm write SetSm;

property N:Integer read CN write SetN;

property t1:Double read Ct1 write Sett1;

property t2:Double read Ct2 write Sett2;

function a(Tf,t1,t2,ti:Double; Sm, N:Integer; ni:byte):Double;

function v(Tf,t1,t2,ti:Double; Sm, N:Integer; ni:byte):Double;

function s(Tf,t1,t2,ti:Double; Sm, N:Integer; ni:byte):Double;

function e(Tf,t1,t2,ti,Фmax,CФmin:Double; N:Integer; ni:byte):Double;

function w(Tf,t1,t2,ti,Фmax,CФmin:Double; N:Integer; ni:byte):Double;

function ф(Tf,t1,t2,ti,Фmax,CФmin:Double; N:Integer; ni:byte):Double;

end;

TMZveno = class //абстрактный класс-родитель для звеньев робота

private

FX, FY: Integer; //текущиекоординатызвена

FColor :Word; //цветзвена

FX0, FY0: Integer; //начальныекоординатызвена

procedure SetColor(const Value: Word);virtual; abstract;

procedure SetX(const Value: Integer); virtual; abstract;

procedure SetY(const Value: Integer); virtual; abstract;

procedure SetX0(const Value: Integer); virtual; abstract;

procedure SetY0(const Value: Integer); virtual; abstract;

public

constructor create;virtual; abstract;

destructor Destroy;virtual; abstract;

procedure Paint(Canvas:TCanvas);virtual; abstract; //процедурапрорисовки

procedure Move(ax:Integer);virtual; abstract; //процедурадвижения

property X:Integer read FX write SetX;

property Y:Integer read FY write SetY;

property X0:Integer read FX0 write SetX0;

property Y0:Integer read FY0 write SetY0;

property Color: Word read FColor write SetColor;

end;

TMOnward = class (TMZveno) //класс для поступательных звеньев

FX, FY: Integer;

FColor : Word;

FX0, FY0: Integer;

FWidth, FHeight :Integer; //ширинаивысотазвена

FPostHeight: Integer; //длинавертикальнойлинии

private

procedure SetWidth(const Value: Integer);

procedure SetHeight(const Value: Integer);

procedure SetPostHeight(const Value: Integer);

procedure SetColor(const Value: Word);override;

procedure SetX(const Value: Integer); override;

procedure SetY(const Value: Integer); override;

procedure SetX0(const Value: Integer); override;

procedure SetY0(const Value: Integer); override;

public

constructor create;override;

destructor Destroy;

procedure Paint(Canvas:TCanvas);override;

procedure Move(ax:Integer);override;

property X;

property Y;

property X0;

property Y0;

property Color;

propertyWidth : integer read FWidth write SetWidth;

property Height : integer read FHeight write SetHeight;

property PostHeight : integer read FPostHeight write SetPostHeight;

end;

TMRotate = class (TMZveno) //классдлявращательныхзвеньев

FX, FY: Integer;

FColor : Word;

FX0, FY0: Integer;

FLength, FRadius: Integer; //длина «схвата» ирадиусшарнира

FФ0, FФ: Double; //начальный угол и моментальный угол

private

procedure SetLength(const Value: Integer);

procedure SetRadius(const Value: Integer);

procedure SetFФ0(const Value: Double);

procedure SetFФ(const Value: Double);

procedure SetColor(const Value: Word);override;

procedure SetX(const Value: Integer); override;

procedure SetY(const Value: Integer); override;

procedure SetX0(const Value: Integer); override;

procedure SetY0(const Value: Integer); override;

public

constructor create;override;

destructor Destroy;

procedure Paint(Canvas:TCanvas);override;

procedure Move(ax:Integer);override;

property X;

property Y;

property X0;

property Y0;

property Color;

propertyLength : integer read FLength write SetLength;

propertyRadius : integer read FRadius write SetRadius;

propertyФ0 : double read FФ0write SetФ0;

propertyФ : double read FФwrite SetФ;

end;

TMRobot = class (TGraphicControl) //класс-контейнерсамогоробота

private

MOnwardA: TMOnward;

MOnwardB: TMOnward;

MRotateC: TMRotate;

FTimer:TTimer; //компоненттипаТаймер

FBitmap:TBitmap; {компоненттипаБитмап (классTBitmapпозволяетредактироватьсвоёизображениевпрограммечерезсвойствоCanvas)}

FWidth, FHeight, FPostHeight : Integer;

FX, FY: Integer;

FColor : Word;

FX0, FY0: Integer;

FLength, FRadius: Integer;

FФ0, FФ: Double;

procedure SetWidth(const Value: Integer);

procedure SetHeight(const Value: Integer);

procedure SetPostHeight(const Value: Integer);

procedure SetColor(const Value: Word);

procedure SetX(const Value: Integer);

procedure SetY(const Value: Integer);

procedure SetX0(const Value: Integer);

procedure SetY0(const Value: Integer);

procedure SetLength(const Value: Integer);

procedure SetRadius(const Value: Integer);

procedure SetFФ0(const Value: Double);

procedure SetFФ(const Value: Double);

public

constructor Create(AOwner: TComponent);

destructor Destroy;

procedure Paint;

procedure Move;

procedureStart; //запуск движения робота

procedureStop; //остановка движения

property X:Integer read FX write SetX;

property Y:Integer read FY write SetY;

property X0:Integer read FX0 write SetX0;

property Y0:Integer read FY0 write SetY0;

property Color: Word read FColor write SetColor;

propertyWidth : integer read FWidth write SetWidth;

property Height : integer read FHeight write SetHeight;

property PostHeight : integer read FPostHeight write SetPostHeight;

propertyLength : integer read FLength write SetLength;

propertyRadius : integer read FRadius write SetRadius;

propertyФ0 : double read FФ0write SetФ0;

propertyФ : double read FФwrite SetФ;

end;

implementation

{ TLawA4 }

function TLawA4.a(Tf,t1,t2,ti:Double; Sm,N: integer; ni:byte):Double;

begin

for ni:=0 to N do

ti:=Tf*ni/N;

begin

if ti<=t1 then

result:=2*Sm/(Tf*t1*(Tf-t1+t2))

else if ti>=t2 then

Result:=-2*Sm/(Tf*(Tf-t1)*(Tf-t1+t2))

else

result:=0;

end;

end;

constructor TLawA4.Create;

begin

inherited;

end;

destructor TLawA4.Destroy;

begin

inherited;

end;

function TLawA4.s(Tf,t1,t2,ti:Double; Sm,N: integer; ni:byte):Double;

begin

for ni:=1 to N do

ti:=Tf*ni/N;

begin

if ti<=t1 then

result:=2*Sm*ti/(Tf*t1*(Tf-t1+t2))

else if ti>=t2 then

Result:=-2*Sm*ti/(Tf*(Tf-t1)*(Tf-t1+t2))

else

result:=Sm/Tf;

end;

end;

procedure TLawA4.SetN(const Value: Integer);

begin

inherited;

CN:=Value;

end;

procedure TLawA4.SetSm(const Value: Integer);

begin

inherited;

CSm:=Value;

end;

procedure TLawA4.Sett1(const Value: Double);

begin

inherited;

Ct1:=Value;

end;

procedure TLawA4.Sett2(const Value: Double);

begin

inherited;

Ct2:=Value;

end;

procedure TLawA4.SetTf(const Value: Double);

begin

inherited;

CTf:=Value;

end;

function TLawA4.v(Tf,t1,t2,ti:Double; Sm,N: integer; ni:byte):Double;

begin

for ni:=1 to N do

ti:=Tf*ni/N;

begin

if ti<=t1 then

result:=2*Sm*Sqr(ti)/(Tf*t1*(Tf-t1+t2))

else if ti>=t2 then

Result:=-2*Sm*Sqr(ti)/(Tf*(Tf-t1)*(Tf-t1+t2))

else

result:=Sm*(ti/Tf);

end;

end;

{ TLawB5 }

function TLawB5.a(Tf,ti:Double; Sm,N: integer; ni:byte):Double;

begin

for ni:=0 to N do

ti:=Tf*ni/N;

result:=(Sm/Tf^2) * (0,5*π^2)*cos(π*ti/Tf);

end;

constructor TLawB5.Create;

begin

inherited;

end;

destructor TLawB5.Destroy;

begin

inherited;

end;

function TLawB5.s(Tf,ti:Double; Sm,N: integer; ni:byte):Double;

begin

for ni:=1 to N do

ti:=Tf*ni/N;

result:=Sm * 0,5*(1 – cos(π*ti/Tf));

end;

procedure TLawB5.SetN(const Value: Integer);

begin

inherited;

CN:=Value;

end;

procedure TLawB5.SetSm(const Value: Integer);

begin

inherited;

CSm:=Value;

end;

procedure TLawB5.SetTf(const Value: Double);

begin

inherited;

CTf:=Value;

end;

function TLawB5.v(Tf,ti:Double; Sm,N: integer; ni:byte):Double;

begin

for ni:=1 to N do

ti:=Tf*ni/N;

result:=(Sm/Tf) * (0,5*π)*sin(π*ti/Tf);

end;

{ TLawC8 }

function TLawC8.e(Tf,ti,Фmax,Фmin:Double; N: integer; ni:byte):Double;

begin

for ni:=0 to N do

ti:=Tf*ni/N;

result:=(Фmax/Tf^2) * 6(1-(ti/Tf));

end;

constructor TLawC8.Create;

begin

inherited;

end;

destructor TLawC8.Destroy;

begin

inherited;

end;

function TLawC8.ф(Tf,ti,Фmax,Фmin:Double; N: integer; ni:byte):Double;

begin

for ni:=1 to N do

ti:=Tf*ni/N;

result:=Фmax * 0,5*(1 – cos(π*ti/Tf));

end;

procedure TLawC8.SetN(const Value: Integer);

begin

inherited;

CN:=Value;

end;

procedure TLawC8.SetФmax(const Value: Double);

begin

inherited;

CSm:=Value;

end;

procedure TLawC8.SetФmin(const Value: Double);

begin

inherited;

CSm:=Value;

end;

procedure TLawC8.SetTf(const Value: Double);

begin

inherited;

CTf:=Value;

end;

function TLawC8.w(Tf,ti,Фmax,Фmin:Double; N: integer; ni:byte):Double;

begin

for ni:=1 to N do

ti:=Tf*ni/N;

result:=(Фmax/Tf) * [6ti*(Tf-ti)]/Tf;

end;

{ TLaw_Movement }

constructor TLaw_Movement.Create;

begin

LawA4.Create;

LawB5.Create;

LawC8.Create;

end;

destructor TLaw_Movement.Destroy;

begin

LawA4.Destroy;

LawA4.Free;

LawB5.Destroy;

LawB5.Free;

LawC8.Destroy;

LawC8.Free;

inherited;

end;

{ TMOnwardA }

constructor TMOnwardA.create;

begin

end;

procedure TMOnwardA.Paint(Canvas:TCanvas);

inherited;

var

Rec: TRect;

with Form1.pnl1.Canvas do

begin

Canvas.Pen.Color := clYellow;

Canvas.Brush.Color := clBlack;

Rec:=Rect(X,Y,X+FLength,Y+FHeight) ;

Canvas.Rectangle(Rec);

Canvas.Pen.Width:=2;

Canvas.MoveTo(X+Length div 4, Y);

Canvas.LineTo(X+Length div 2, Y-FPostHeight);

end;

end;

procedure TMOnwardA.SetWidth(const Value: Integer);

begin

FWidth := Value;

end;

procedure TMOnwardA.SetHeight(const Value: Integer);

begin

FHeight := Value;

end;

destructor TMOnwardA.Destroy;

begin

inherited;

end;

procedure TMOnwardA.Move(ax: Integer);

begin

inherited;

FX:=FX0+round(TLawA4.s(Tf,t1,t2,Sm,N));

end;

procedure TMOnwardA.SetColor(const Value: Word);

begin

inherited;

FColor:= Value;

end;

procedure TMOnwardA.SetPostHeight(const Value: Integer);

begin

FPostHeight:=Value;

end;

procedure TMOnwardA.SetX(const Value: Integer);

begin

inherited;

FX:=Value;

end;

procedure TMOnwardA.SetX0(const Value: Integer);

begin

inherited;

FX0:=Value;

end;

procedure TMOnwardA.SetY(const Value: Integer);

begin

inherited;

FY:=Value;

end;

procedure TMOnwardA.SetY0(const Value: Integer);

begin

inherited;

FY0:=Value;

end;

{ TMOnwardA }

constructor TMOnwardB.create;

begin

end;

procedure TMOnwardB.Paint(Canvas:TCanvas);

inherited;

var

Rec: TRect;

with Form1.pnl1.Canvas do

begin

Canvas.Pen.Color := clYellow;

Canvas.Brush.Color := clBlack;

Rec:=Rect(X,Y,X+FWidth,Y+FHeight) ;

Canvas.Rectangle(Rec);

Canvas.Pen.Width:=2;

Canvas.MoveTo(X+Width div 4, Y);

Canvas.LineTo(X+Width div 2, Y-FPostHeight);

end;

end;

procedure TMOnwardB.SetWidth(const Value: Integer);

begin

FWidth := Value;

end;

procedure TMOnwardB.SetHeight(const Value: Integer);

begin

FHeight := Value;

end;

destructor TMOnwardB.Destroy;

begin

inherited;

end;

procedure TMOnwardB.Move(ax: Integer);

begin

inherited;

FX:=TMOnwardA.FX;

FY:=FY0 + round(TLawB5.s(Tf,N,Sm));

end;

procedure TMOnwardB.SetColor(const Value: Word);

begin

inherited;

FColor:= Value;

end;

procedure TMOnwardB.SetPostHeight(const Value: Integer);

begin

FPostHeight:=Value;

end;

procedure TMOnwardB.SetX(const Value: Integer);

begin

inherited;

FX:=Value;

end;

procedure TMOnwardB.SetX0(const Value: Integer);

begin

inherited;

FX0:=Value;

end;

procedure TMOnwardB.SetY(const Value: Integer);

begin

inherited;

FY:=Value;

end;

procedure TMOnwardB.SetY0(const Value: Integer);

begin

inherited;

FY0:=Value;

end;

{ TMOnwardA }

constructor TMRotateC.create;

begin

end;

procedure TMRotateC.Paint(Canvas:TCanvas);

inherited;

var

Rec: TRect;

with Form1.pnl1.Canvas do

begin

Canvas.Pen.Color := clYellow;

Canvas.Brush.Color := clBlack;

Rec:=Rect(X,Y,X+FLength,Y+FHeight) ;

Canvas.Rectangle(Rec);

Canvas.Pen.Width:=2;

Canvas.MoveTo(X+Length div 4, Y);

Canvas.LineTo(X+Length div 2, Y-FPostHeight);

end;

end;

procedure TMOnwardA.SetLength(const Value: Integer);

begin

FLength := Value;

end;

procedure TMRotateC.SetRadius(const Value: Integer);

begin

FRadius := Value;

end;

destructor TMRotateC.Destroy;

begin

inherited;

end;

procedure TMRotateC.Move(ax: Integer);

begin

inherited;

FX:=FX0+round(TLawA4.s(Tf,t1,t2,Sm,N));

end;

procedure TMRotateC.SetColor(const Value: Word);

begin

inherited;

FColor:= Value;

end;

procedure TMRotateC.SetX(const Value: Integer);

begin

inherited;

FX:=Value;

end;

procedure TMRotateC.SetX0(const Value: Integer);

begin

inherited;

FX0:=Value;

end;

procedure TMRotateC.SetY(const Value: Integer);

begin

inherited;

FY:=Value;

end;

procedure TMRotateC.SetY0(const Value: Integer);

begin

inherited;

FY0:=Value;

end;

{ TMRobot }

constructor TMRobot.Create;

begin

MOnwardA.Create;

MOnwardB.Create;

MRotateC.Create;

end;

destructor TMRobot.destroy;

begin

MOnwardA.Free;

MOnwardA.Destroy;

MOnwardB.Destroy;

MOnwardB.Free;

MRotateC.Destroy;

MRotateC.Free;

inherited;

end;

procedure TMRobot.Move;

begin

if Time=Tf then back := True;

if Time=0 then back := False;

MOnwardA.X := Round(TLawA4.s(Tf,t1,t2,Sm,N));

MOnwardB.X:=MOnwardA.X;

MOnwardB.Y:=Round(TLawB5.s(Tf,Sm,N));

Show;

end;

procedure TMRobot.Paint;

begin

MOnwardA.Paint(Canvas);

MOnwardB.Paint(Canvas);

MRotateC.Paint(Canvas);

end;

end.//конец модуля

libraryProject; //как видно из названия, библиотека

{ Important note about DLL memory management: ShareMem must be the

first unit in your library's USES clause AND your project's (select

Project-View Source) USES clause if your DLL exports any procedures or

functions that pass strings as parameters or function results. This

applies to all strings passed to and from your DLL--even those that

are nested in records and classes. ShareMem is the interface unit to

the BORLNDMM.DLL shared memory manager, which must be deployed along

with your DLL. To avoid using BORLNDMM.DLL, pass string information

using PChar or ShortString parameters. }

uses

SysUtils,

Classes,

Logo in 'Logo.pas';

Prog in ‘Prog.pas’;

Dev in ‘Dev.pas’;

exports ShowLogo index 11;

exports ShowProg index 12;

exports ShowDev index 13;

{$R *.res}

begin

end.

unitLogo; //заставка

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, jpeg;

type

TLogo = class(TForm)

img1: TImage;

tmr1: TTimer;

procedure tmr1Timer(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Logo: TLogo;

procedure ShowLogo(Handle:THandle);export;stdcall;

implementation

{$R *.dfm}

procedure ShowLogo(Handle:THandle);

begin

Application.Handle := Handle;

Logo := TLogo.Create(Application);

Logo.ShowModal;

Logo.Free;

end;

procedure TLogo.tmr1Timer(Sender: TObject);

begin

tmr1.Enabled:= False;

tmr1.Free;

img1.Free;

Close;

end;

end.//конецмодуля

unitProg; //Опрограмме

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, jpeg;

type

TProg = class(TForm)

img1: TImage;

private

{ Private declarations }

public

{ Public declarations }

end;

var

Prog: TProg;

procedure ShowProg;export;stdcall;

implementation

{$R *.dfm}

procedure ShowProg;

begin

Prog := TProg.Create(Application);

Prog.ShowModal;

Prog.Free;

end;

end.//конец модуля

unitDev; //Оразработчике

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, jpeg;

type

TDev = class(TForm)

img1: TImage;

private

{ Private declarations }

public

{ Public declarations }

end;

var

Dev: TDev;

procedure ShowDev;export;stdcall;

implementation

{$R *.dfm}

procedure ShowDev;

begin

Dev := TDev.Create(Application);

Dev.ShowModal;

Dev.Free;

end;

end.//конец модуля и конец библиотеки

Заключение.

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

Список использованной литературы.

1. Ничушкина Т.Н, Иванова Г.С. Объектно-ориентированное программирование, 316 c., изд. МГТУ им. Н.Э. Баумана, 2001 г.

2. http://www.oop-stud.ru/

3. Мансуров К. Т. Основы программирования в среде Lazarus, 772 c., 2010г.

4. Баженова И. О. Delphi 7 Самоучитель программиста, 448 с., КУДИЦ-ОБРАЗ, Москва, 2003 г.

Наши рекомендации