unit PAN; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Label11: TLabel; Label12: TLabel; Label13: TLabel; Label14: TLabel; Label15: TLabel; Edit1: TEdit; Edit2: TEdit; Button1: TButton; Label17: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; Const massa=98000; Var Form1: TForm1; H1,H2,V1,V2,razb_V,razb_H,j,i,n:integer; dV,dH,H_tek,V_tek:real; implementation {$R *.dfm} function g(h:real):real; {зависимость ускорения свободного падения от высоты} begin g:=9.806-0.000003078*h; end; function ro(h:real):real; {зависимость плотности воздуха от высоты} begin ro:=1.2085-0.000094547*h; end; function a(h:real):real; {зависимость скорость звука от высоты} begin a:=340.3937-0.003969*h; end; function P(m:real):real; {зависимость тяги двигателя от числа Маха } begin P:=2.72*m*m-4.95*m+32.24; end; function Cy(alfa:real):real; {зависимость коэф-та подъемной силы от угла атаки} begin Cy:=0.082*alfa-0.221; end; function Cx(alfa:real):real; {зависимость коэф-тa лобового сопротивления от Cy} begin Cx:=0.128*Cy(alfa)*Cy(alfa)-0.072*Cy(alfa)+0.032; end; function q(h,V:real):real; {зависимость скоростного напора от высоты и скорости} begin q:=ro(h)*V*V/2; end; function H_kr(V:real):real; begin H_kr:=-0.173*V*V+326.1*V-146862.5; end; procedure a_12(var time:real;dV,H,V_tek:real); {горизонтальное перемещение} Var p1,teta,alfa:real; begin p1:=3*9.8*P(V_tek/a(h)); teta:=0; alfa:=(massa*g(h)-q(h,V_tek)*201*0.221)/(p1+57.3*q(h,V_tek)*201*0.082); time:=massa*dV/(p1-q(h,V_tek)*201*Cx(alfa*57.3)); end; procedure b_14(var time:real;dH,H,V_tek:real); {вертикальное перемещение} Var p1,teta,alfa:real; begin p1:=3*9.8*P(V_tek/a(h)); alfa:=(massa*g(h)-q(h,V_tek)*127*0.221)/(p1+57.3*q(h,V_tek)*201*0.082); teta:=(p1-q(h,V_tek)*201*Cx(alfa*57.3))/(massa*g(h)); time:=dH/(V_tek*sin(teta)); end; procedure c_13(var time:real;dH,H,dV,V_tek:real); {разгон-подъем} Var p1,teta,alfa:real; begin p1:=3*9.8*P(V_tek/a(h)); alfa:=(massa*g(h)-q(h,V_tek)*201*0.221)/(p1+57.3*q(h,V_tek)*201*0.082); teta:=(p1-q(h,V_tek)*201*Cx(alfa*57.3))/(massa*dV/dH*V_tek+massa*g(h)); time:=dH/(dV*teta)*ln((V_tek+dV/2)/(V_tek-dV/2)); end; procedure TForm1.Button1Click(Sender: TObject); type zap=record time:real; naprav:integer; end; const x0=40; y0=700; dx=30; dy=30; h=360; w=360; H1=400; H2=6500; V1=320; V2=900; Var a_poleta:array [1..100] of real; x,y,k,alfa_nom:integer; lx,ly,dlx,dly,all_time:real; visota,dalnost:array[1..100] of real; A1,B,C:array [1..70,1..70] of real; D:array [1..70,1..70]of zap; Begin if button1.Caption='Закончить' then close; razb_V:=StrToInt(Form1.Edit2.Text); {кол-во разбиений по оси V} razb_H:=StrToInt(Form1.Edit1.Text); {кол-во разбиений по оси H} dV:=(V2-V1)/razb_V; dH:=(H2-H1)/razb_H; label13.Caption:=FloatToStr(dV)+' км/ч'; label11.Caption:=FloatToStr(dH)+' м'; H_tek:=H2; V_tek:=V2-dV/2; for i:=1 to razb_H+1 do begin for j:=1 to razb_V do begin if H_tek>H_kr(V_tek) then a_12(A1[i,j],dV/3.6,H_tek,V_tek/3.6) else A1[i,j]:=1000; V_tek:=V_tek-dV; end; V_tek:=V2-dV/2; H_tek:=H_tek-dH; end; H_tek:=H2-dH/2; V_tek:=V2; for i:=1 to razb_H do begin for j:=1 to razb_V+1 do begin if H_tek>H_kr(V_tek) then b_14(B[i,j],dH,H_tek,V_tek/3.6) else B[i,j]:=1000; V_tek:=V_tek-dV; end; H_tek:=H_tek-dH; V_tek:=V2; end; H_tek:=H2-dH/2; V_tek:=V2-dV/2; for i:=1 to razb_H do begin for j:=1 to razb_V do begin if H_tek>H_kr(V_tek) then c_13(C[i,j],dH,H_tek,dV/3.6,V_tek/3.6) else C[i,j]:=1000; V_tek:=V_tek-dV; end; V_tek:=V2-dV/2; H_tek:=H_tek-dH; end; D[1,1].time:=0; D[1,1].naprav:=0; for j:=2 to razb_V+1 do begin D[1,j].time:=A1[1,j-1]+d[1,j-1].time; D[1,j].naprav:=1; end; for i:=2 to razb_H+1 do begin D[i,1].time:=B[i-1,1]+d[i-1,1].time; d[i,1].naprav:=3; end; for i:=2 to razb_H+1 do for j:=2 to razb_V+1 do begin if (A1[i,j-1]+d[i,j-1].time)<(b[i-1,j]+d[i-1,j].time) then if (A1[i,j-1]+d[i,j-1].time)<(c[i-1,j-1]+d[i-1,j-1].time) then begin d[i,j].time:=A1[i,j-1]+d[i,j-1].time; d[i,j].naprav:=1; end else begin d[i,j].time:=c[i-1,j-1]+d[i-1,j-1].time; d[i,j].naprav:=2; end else if (b[i-1,j]+d[i-1,j].time)<(c[i-1,j-1]+d[i-1,j-1].time) then begin d[i,j].time:=b[i-1,j]+d[i-1,j].time; d[i,j].naprav:=3; end else begin d[i,j].time:=c[i-1,j-1]+d[i-1,j-1].time; d[i,j].naprav:=2; end; end; button1.Caption:='Закончить'; {построение осей полетной области} dlx:=(V2-V1)/10; dly:=(H2-H1)/10; with Form1.Canvas do begin Pen.Color:=clBlue; pen.Width:=1; MoveTo(x0,y0); LineTo(x0,y0-h); {вертикальная ось координат полетной области} MoveTo(x0,y0); LineTo(x0+w,y0); {горизонтальная ось координат полетной области} Pen.Color:=clBlue; x:=x0+dx; lx:=V1; repeat {рисование вертикальных линий сеток с подписями} Pen.Style:=psSolid; MoveTo(x,y0-3); LineTo(x,y0+3); TextOut(x-8,y0+5,FloatToStr(lx)); Pen.Style:=psDot; MoveTo(x,y0-3); LineTo(x,y0-h); lx:=lx+round(dlx); x:=x+dx; until (x>x0+w); y:=y0-dy; ly:=H1; repeat {рисование вертикальных линий сеток с подписями} MoveTo(x0-3,y); LineTo(x0+3,y); TextOut(x0-30,y,FloatToStr(ly)); Pen.Style:=psDot; MoveTo(x0+3,y); LineTo(x0+w,y); Pen.Style:=psSolid; y:=y-dy; ly:=ly+round(dly); until (y