Автор работы: Пользователь скрыл имя, 14 Марта 2015 в 21:52, курсовая работа
Под визуализацией программного обеспечения понимается совокупность методик использования графики и средств человеко-машинного взаимодействия, применяемых для лучшего уяснения понятий и эффективной эксплуатации программного обеспечения, а также для спецификации и представления программных объектов в процессе создания программ. Проектирование является одной из основных стадий создания изделия в технике.
if abs(MyHSP.V(T)*100)>ChartRes.
begin
ChartRes.LeftAxis.Maximum:=
ChartRes.LeftAxis.Minimum:=-
end;
ChartRes.Series[0].AddXY(T,
ChartRes.Series[1].AddXY(T,
chartEnergy.Series[0].Clear;
chartEnergy.Series[1].Clear;
chartEnergy.Series[0].AddY(
chartEnergy.Series[1].AddY(
end;
procedure TMainForm.bStartPauseClick(
begin
Tmr.Enabled := not Tmr.Enabled;
if Tmr.Enabled then
bStartPause.Caption := 'Пауза'
else
bStartPause.Caption := 'Старт'
end;
procedure TMainForm.bResetClick(Sender: TObject);
var
flag:boolean;
begin
flag := Tmr.Enabled;
Tmr.Enabled := false;
eMassa.Text := FloatToStr(MyHSP.M);
eL.Text := IntToStr(MyHSP.Length);
eK1.Text := FloatToStr(MyHSP.Kleft);
eK2.Text := FloatToStr(MyHSP.Kright);
eX0.Text:= IntToStr(Round(MyHSP.X0*100));
eAlfa.Text := FloatToStr(MyHSP.Alfa);
upd1.Position := MyHSP.TurnsCnt_1;
upd2.Position := MyHSP.TurnsCnt_2;
MyHSP.Print(img, 0);
T := 0;
ChartRes.Series[0].Clear;
ChartRes.Series[1].Clear;
ChartRes.LeftAxis.Minimum:= -MyHSP.Length;
ChartRes.LeftAxis.Maximum:= MyHSP.Length;
ChartRes.BottomAxis.Minimum := 0;
ChartRes.BottomAxis.Maximum := 10;
chartEnergy.LeftAxis.Minimum := 0;
chartEnergy.LeftAxis.Maximum:= MyHSP.EnergyPotential(0);
bStartPause.Enabled := true;
Tmr.Enabled := flag;
end;
procedure TMainForm.bIniValueClick(
var
res:boolean;
begin
Tmr.Enabled:=false;
bStartPause.Enabled:=false;
bStartPause.Caption:='Старт';
T:=0;
Series1.Clear;
Series2.Clear;
Series3.Clear;
Series4.Clear;
if InitValue then
begin
bReset.Enabled:=true;
bStartPause.Enabled:=true;
MyHSP.Print(img,0); end;
end;
end.
unit HSP;
interface
uses Graphics, ExtCtrls, Math, SysUtils;
type
THSP = class
private
LArea:integer;
SH:real;
Hw, Ww:real;
Hf,Wf:real;
Wcargo:real;
Cnt1, Cnt2:byte;
_CargoColor,
_SpringColor, _WallFoundationColor:TColor;
_k1, _k2:real;
massa:real;
_X0:real
_alfa:real;
public
property Length: integer read LArea write LArea;
property TurnsCnt_1: byte read Cnt1 write Cnt1;
property TurnsCnt_2: byte read Cnt2 write Cnt2;
property CargoColor: TColor read _CargoColor write _CargoColor;
property SpringColor: TColor read _SpringColor write _SpringColor;
property WallFoundationColor: TColor read _WallFoundationColor write _WallFoundationColor;
property SpringHeight: real read SH write SH;
property WallHeight: real read Hw write Hw;
property WallWidth: real read Ww write Ww;
property FoundationHeight: real read Hf write Hf;
property FoundationWidth: real read Wf write Wf;
property CargoWidth: real read WCargo write WCargo;
property X0: real read _X0 write _X0;
property Kleft: real read _k1 write _k1;
property Kright: real read _k2 write _k2;
property M: real read massa write massa;
property Alfa: real read _alfa write _alfa;
constructor Create;
procedure Print(var img:TImage; t:real);
function X(t:real):real;
function V(t:real):real;
function EnergyKinetik(t:real):real;
function EnergyPotential(t:real):real;
end;
implementation
constructor THSP.Create;
begin
Ww := 0.05;
Wf := 1;
Hw := 0.6;
Hf := 0.2;
WCargo := 0.1;
_WallFoundationColor := clBlue;
_SpringColor:=clBlack;
_CargoColor:=clGreen;
sh := 0.1;
Cnt1:=7;
Cnt2:=9
end;
procedure THSP.Print(var img:TImage; t:real);
var
pX, pY, W_cargo, H_cargo, X0, Y0 :integer;
L, i, L_spring, Cnt:integer;
sh_curr:integer;
dx:real;
begin
if LArea<>0 then
dx:=X(t)*100/LArea
else
dx:=0;
img.Picture := nil;
img.Canvas.Brush.Color:= _WallFoundationColor;
img.Canvas.Pen.Color:= _WallFoundationColor;
img.Canvas.Pen.Width := 1;
img.Canvas.Rectangle(0, Round( img.Height*(1-Hw) ) , Round(img.Width*Ww), img.Height);
img.Canvas.Rectangle(img.
img.Canvas.Rectangle(0, Round( img.Height*(1-Hf) ) , img.Width, img.Height);
pY := Round (img.Height * (1-(Hf+Hw)/2) );
sh_curr := Round( min(sh, (Hw - Hf)/2 ) * img.Height );
W_cargo:= Round( min(0.5, Wcargo)*img.Width );
H_cargo := Round( img.Height * (Hw - Hf) );
L:= max(5, Round(img.Width*0.01));
Y0 := pY;
X0 := img.Width div 2 + Round( dx * ( img.Width - 2*(img.Width * Ww + L) )/2 );
img.Canvas.Brush.Color := _CargoColor;
img.Canvas.Pen.Color := _CargoColor;
img.Canvas.Pen.Width := 3;
img.Canvas.Rectangle(X0 - W_cargo div 2, Y0 - H_cargo div 2, X0 + W_cargo div 2, Y0 + H_cargo div 2);
img.Canvas.Brush.Color := _SpringColor;
img.Canvas.Pen.Color := _SpringColor;
pX := Round(img.Width * Ww);
img.Canvas.MoveTo(pX,Y0);
img.Canvas.LineTo(pX+L,Y0);
pX := Round(img.Width * (1 - Ww) );
img.Canvas.MoveTo(pX,Y0);
img.Canvas.LineTo(pX-L,Y0);
pX := X0 - W_cargo div 2;
img.Canvas.MoveTo(pX,Y0);
img.Canvas.LineTo(pX-L,Y0);
pX := X0 + W_cargo div 2;
img.Canvas.MoveTo(pX,Y0);
img.Canvas.LineTo(pX+L,Y0);
pX := Round(img.Width * Ww) + L;
L_Spring := X0 - W_cargo div 2 - L - pX + 1;
img.Canvas.MoveTo(pX,Y0);
for i:=1 to Cnt1 do
if i mod 2 = 0 then
img.Canvas.LineTo(Round(pX + i/(Cnt1+1)*L_Spring), Y0 -sh_curr )
else
img.Canvas.LineTo(Round(pX + i/(Cnt1+1)*L_Spring), Y0 +sh_curr );
img.Canvas.LineTo(X0 - W_cargo div 2 - L + 1,Y0);
pX := Round(img.Width * (1 - Ww) ) - L;
L_Spring := pX - (X0 + W_cargo div 2 + L) + 1;
img.Canvas.MoveTo(pX,Y0);
for i:=1 to Cnt2 do
if i mod 2 = 1 then
img.Canvas.LineTo(Round(pX - i/(Cnt2+1)*L_Spring), Y0 -sh_curr )
else
img.Canvas.LineTo(Round(pX - i/(Cnt2+1)*L_Spring), Y0 +sh_curr );
img.Canvas.LineTo(X0 + W_cargo div 2 + L - 1,Y0);
if L>0 then
begin
img.Canvas.Brush.Color := clWhite;
img.Canvas.Pen.Color := clBlack;
img.Canvas.Pen.Width := 3;
X0:=img.Width div 2;
pX := Round(img.Width * Ww) + L;
pY:=30;
img.Canvas.MoveTo(pX,pY);
img.Canvas.LineTo(img.Width-
Cnt := LArea div 2;
for i:=1 to Cnt do
begin
img.Canvas.Pen.Width := 3;
img.Canvas.MoveTo(Round( X0+(X0-pX)*2*i/LArea ), pY-3 );
img.Canvas.LineTo(Round( X0+(X0-pX)*2*i/LArea ), pY+3 );
img.Canvas.MoveTo(Round( X0-(X0-pX)*2*i/LArea ), pY-3 );
img.Canvas.LineTo(Round( X0-(X0-pX)*2*i/LArea ), pY+3 );
img.Canvas.Pen.Width := 1;
img.Canvas.TextOut(Round( X0+(X0-pX)*2*i/LArea)-5 , pY+6-30*(i mod 2), IntToStr(i*2));
img.Canvas.TextOut(Round( X0-(X0-pX)*2*i/LArea)-10 , pY+6-30*(i mod 2), IntToStr(-i*2));
end;
img.Canvas.Pen.Width := 3;
img.Canvas.MoveTo(X0, pY-3 );
img.Canvas.LineTo(X0, pY+3 );
img.Canvas.MoveTo(pX,pY-3);
img.Canvas.LineTo(pX,pY+3);
img.Canvas.MoveTo(img.Width-
img.Canvas.LineTo(img.Width-
img.Canvas.TextOut( X0-5 , pY+6, '0');
if LArea mod 2 =1 then
begin
img.Canvas.TextOut(Round( X0+(X0-pX))-5 , pY+6-30*((Cnt+1) mod 2), IntToStr(LArea));
img.Canvas.TextOut(Round( X0-(X0-pX))-10 , pY+6-30*((Cnt+1) mod 2), IntToStr(-LArea));
end;
end;
end;
function THSP.X(t:real):real;
var
w0, gamma, wf, fi, b1, b2, A, B:real;
c:integer;
begin
w0:=sqrt((_k1+_k2)/massa);
gamma := _alfa / (2 * massa);
if X0<>0 then
fi := X0/abs(X0)*Pi/2
else
fi := 0;
if gamma<w0 then c:=1;
if gamma=w0 then c:=2;
if gamma>w0 then c:=3;
case c of
1: begin
wf := sqrt(w0*w0-gamma*gamma);
Result := abs(X0)*exp(-gamma*t)*sin(wf*
end;
2: begin
A := x0;
B := gamma*x0;
Result := (A+B*t)*exp(-gamma*t);
end;
3: begin
b1:=gamma - sqrt(gamma*gamma - w0*w0);
b2:=gamma + sqrt(gamma*gamma - w0*w0);
A := b2*x0/(b2-b1);
B := x0-b2*x0/(b2-b1);
Result := A*exp(-b1*t)+B*exp(-b2*t);
end;
end;
end;
function THSP.V(t:real):real;
var
w0, gamma, wf, fi, b1, b2, A, B:real;
c:integer;
begin
w0:=sqrt((_k1+_k2)/massa);
gamma := _alfa / (2 * massa);
if X0<>0 then
fi := X0/abs(X0)*Pi/2
else
fi := 0;
if gamma<w0 then c:=1;
if gamma=w0 then c:=2;
if gamma>w0 then c:=3;
case c of
1: begin
wf := sqrt(w0*w0-gamma*gamma);
Result := -gamma*abs(X0)*exp(-gamma*t)*
+ abs(X0)*exp(-gamma*t)*wf*cos(
end;
2: begin
A := x0;
B := gamma*x0;
Result := B*exp(-gamma*t) - gamma*(A+B*t)*exp(-gamma*t);
end;
3: begin
b1:=gamma - sqrt(gamma*gamma - w0*w0);
b2:=gamma + sqrt(gamma*gamma - w0*w0);
A := b2*x0/(b2-b1);
B := x0-b2*x0/(b2-b1);
Result := -b1*A*exp(-b1*t)-b2*B*exp(-b2*
end;
end;
end;
function THSP.EnergyKinetik(t:real):
begin
Result := 1/2*Massa*V(t)*V(t);
end;
function THSP.EnergyPotential(t:real):
begin
Result := (_k1+_k2)/2*X(t)*X(t);end;end.
Информация о работе Моделирование колебаний горизонтального маятника на двух пружинах