Реактивное движение
Пытаюсь смоделировать движение многоступенчатой ракеты.(ракета имеет N ступеней с одинаковым количеством топлива в каждой)
Для упрощения задачи представил ,что топливо сжигается моментально, но чтобы ступени моментално не отстыковывались и приращения к скорости проходили не моментально, задал период
Код:
per:=MTEK/MC; // где MTEK-это текущая масса, а MC-это сухая масса ракеты
Проблема состоит в том, что масса сразу после старта ракеты уходит в минус.
Я не знаю как задать начальные параметры так, чтобы скорость ракеты после всех приращения стала постоянная.
Прикладываю архив с проектом.
Вот код первого юнита
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
PaintBox1: TPaintBox;
Edit4: TEdit;
Label4: TLabel;
Button3: TButton;
Timer1: TTimer;
Button2: TButton;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Button4: TButton;
Label9: TLabel;
Button5: TButton;
Label10: TLabel;
Button6: TButton;
Label11: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
h,w,u0,v0,i,mx,my,k,o,kt:integer;
Vx,Vy,dt,x,y,r,dx,dy,Fx,Fy,Ax,Ay,nt,cn,MT,MC,N,m,u,MTEK,per,stper,Vn,Vtek,t,Vstat:real;
x2,y2:integer;
implementation
uses Unit2,Unit4;
{$R *.dfm}
procedure perevod(x1,y1:real; mx,my,v0,u0:integer;var x2,y2:integer);
begin
x2:=round(u0+x1*mx);
y2:=round(v0-y1*my);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MT:=strtoint(form2.edit1.Text);
MC:=strtoint(form2.edit2.Text);
N:=strtoint(form2.Edit3.Text);
m:=MT/N;
u:=strtoint(form2.edit4.Text);
x:=5;
y:=0;
Vx:=0;
Vy:=0.2;
Vstat:=0.4;
dt:=0.1;
t:=0;
stper:=0;
Vtek:=1;
MTEK:=50;
per:=MTEK/MC;
Vn:=(m*u)/(MC+(1*m));
u0:=strtoint(edit1.Text);
v0:=strtoint(edit2.Text);
mx:=strtoint(edit3.Text);
my:=strtoint(edit4.Text);
paintbox1.Canvas.MoveTo(0,v0);
paintbox1.Canvas.LineTo(w,v0);
paintbox1.Canvas.MoveTo(u0,h);
paintbox1.Canvas.LineTo(u0,0);
k:=u0;
o:=1;
i:=1;
while (o<20) do
begin
k:=k+mx;
paintbox1.Canvas.MoveTo(k,v0-4);
paintbox1.Canvas.LineTo(k,v0+4);
paintbox1.Canvas.TextOut(k,v0+20,inttostr(i));
i:=i+1;
o:=o+1;
end;
k:=u0;
o:=1;
i:=-1;
while (o<20) do
begin
k:=k-mx;
paintbox1.Canvas.MoveTo(k,v0-4);
paintbox1.Canvas.LineTo(k,v0+4);
paintbox1.Canvas.TextOut(k,v0+20,inttostr(i));
i:=i-1;
o:=o+1;
end;
k:=v0;
i:=-1;
o:=1;
while (o<20) do
begin
k:=k+my;
paintbox1.Canvas.MoveTo(u0-4,k);
paintbox1.Canvas.LineTo(u0+4,k);
paintbox1.Canvas.TextOut(u0+15,k,inttostr(i));
i:=i-1;
o:=o+1;
end;
k:=v0;
i:=1;
o:=1;
while (o<20) do
begin
k:=k-my;
paintbox1.Canvas.MoveTo(u0-4,k);
paintbox1.Canvas.LineTo(u0+4,k);
paintbox1.Canvas.TextOut(u0+15,k,inttostr(i));
i:=i+1;
o:=o+1;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
timer1.Enabled:=true;
form1.Label10.Visible:=false;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
close;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
if form2.Visible=true then
form2.Hide else
form2.Show;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
timer1.Enabled:=false;
form1.label10.Visible:=true;
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
if form4.Visible then
form4.Hide else
form4.Show;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
w:=paintbox1.Width;
h:=paintbox1.Height;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
MTEK:=MT-m;
y:=y+Vtek*dt;
t:=t+dt;
stper:=stper+dt;
if stper=per then
begin
Vtek:=Vtek+Vn;
stper:=0;
end;
nt:=y;
perevod(x,y,mx,my,v0,u0,x2,y2);
paintbox1.Canvas.Pixels[x2,y2]:=clred;
form4.Label1.caption:=floattostr(y);
form4.Label2.Caption:=floattostr(Vtek);
form4.Label3.Caption:=floattostr(MT);
label11.Caption:=floattostr(t);
end;
end.
|