Имитационная модель программы.
Описание имитационной модели программы является одним из важнейших этапов проектирования любой программы, так как в ней можно наглядно, в графической форме, увидеть, как именно должна будет работать программа. Ниже приведена схема имитационной модели программы.
Оператор |
Монитор |
Панель управления |
Всплывающее меню |
Главное меню |
Форма с моделированием движения робота |
Форма «О разработчике» |
Форма «О программе» |
Форма Помощник |
Форма с графиками и таблицами |
Разработка математической модели.
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 г.