Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.01.2013, 18:44
Teodor_Master Teodor_Master вне форума
Прохожий
 
Регистрация: 09.01.2013
Сообщения: 1
Репутация: 10
Восклицание Реактивное движение

Пытаюсь смоделировать движение многоступенчатой ракеты.(ракета имеет 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.
Вложения
Тип файла: rar Gas Rocket Vtek.rar (215.5 Кбайт, 4 просмотров)
Ответить с цитированием
  #2  
Старый 09.01.2013, 20:30
my33oh my33oh вне форума
Новичок
 
Регистрация: 17.12.2012
Сообщения: 93
Репутация: -579
По умолчанию

Цитата:
Сообщение от Teodor_Master
ракета имеет N ступеней с одинаковым количеством топлива в каждой
стремная идея однако
даже троечник по физике (типа меня) сможет понять что при определенном N (предполагаю что от 3) ракета вообще не взлетит
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:10.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025