Program ZapocetStrelba;
USES
	crt;
CONST
	h=0.0005; {velikost kroku}
	pi=3.141592654;
	presnost=0.0025; {rozhoduje o strefeni/nestrefeni cile}
TYPE
	vektor=array[1..4] of real; {pro fce}
	vektor2=array[1..3] of real; {pro uhly a dopady}
PROCEDURE f(tn:real; w:vektor;  c,g:real; var fi:vektor); {zadani fci}
	BEGIN
		fi[1]:=w[3]*cos(w[4]);
		fi[2]:=w[3]*sin(w[4]);
		fi[3]:=-c*sqr(w[3])-g*sin(w[4]);
		fi[4]:=-g/w[3]*cos(w[4]);
	END;
PROCEDURE RKstep(tn:real; c,g:real; var w:vektor); {krok Runge-Kuttovy metody 4. radu pro vsechny 4 rce}
	VAR
		k1,k2,k3,k4,fi,pom:vektor;
		i:integer;
	BEGIN
		f(tn,w,c,g,fi);
		FOR i:=1 TO 4 DO k1[i]:=h*fi[i];
		FOR i:=1 TO 4 DO pom[i]:=w[i]+k1[i]/2;
		f(tn+h/2,pom,c,g,fi);
		FOR i:=1 TO 4 DO k2[i]:=h*fi[i];
		FOR i:=1 TO 4 DO pom[i]:=w[i]+k2[i]/2;
		f(tn+h/2,pom,c,g,fi);
		FOR i:=1 TO 4 DO k3[i]:=h*fi[i];
		FOR i:=1 TO 4 DO pom[i]:=w[i]+k3[i];
		f(tn+h,pom,c,g,fi);
		FOR i:=1 TO 4 DO k4[i]:=h*fi[i];
		FOR i:=1 TO 4 DO BEGIN
 			w[i]:=w[i]+(k1[i]+2*k2[i]+2*k3[i]+k4[i])/6;
 		END;
	END;
VAR
	wr:vektor;
	i:integer;
	tn,cilx,cily,c,g,v:real;
	u,xf:vektor2;
	s:string[2];
	s2:string[11];
	ans,fs:string[1];
	fileout:text;
BEGIN
	REPEAT
		ClrScr;
		WRITELN('Rovnice zadany ve tvaru:');
		WRITELN('   dx/dt=v*cos(theta)');
		WRITELN('   dy/dt=v*sin(theta)');
		WRITELN('   dv/dt=-c*sqr(v)-g*sin(theta)');
		WRITELN('   dtheta/dt=-g/v*cos(theta)');
		WRITELN;
		WRITELN('Puvodni zadani: c=2, g=10, v(0)=25, cil: [7,1].');
                WRITELN('Pro tyto hodnoty neexistuje reseni.');
                WRITELN('Aby reseni existovalo, staci c=0.2.');
		WRITELN;
		WRITE('   Zadej c: ');
		READLN(c);
		WRITE('   Zadej g: ');
		READLN(g);
		WRITE('   Zadej v(0): ');
		READLN(v);
		WRITELN;
		WRITELN('Cil:');
		WRITE('   Souradnice x: ');
		READLN(cilx);
		WRITE('   Souradnice y: ');
		READLN(cily);
		WRITELN;
		REPEAT
			WRITE('Vytvaret textove soubory [y/n]? '); {pokud nas zajima vedle vysledku i prubeh}
			READLN(fs);
		UNTIL ((fs='y') or (fs='n'));
		u[1]:=45;
		u[2]:=5;
		u[3]:=(u[1]+u[2])/2;
		FOR i:=1 TO 3 DO BEGIN
			IF (fs='y') THEN BEGIN
				Str(i,s);
				s2:='strel'+s+'.dat';
				ASSIGN(fileout,s2);
				REWRITE(fileout);
			END;
			tn:=0; {pocatecni cas}
			wr[1]:=0; {pocatecni x}
			wr[2]:=0; {pocatecni y}
			wr[3]:=v; {pocatecni v}
			wr[4]:=u[i]/180*pi; {pocatecni uhel}
			IF (fs='y') THEN WRITELN(fileout,tn:5:3,' ',wr[1]:5:3,' ',wr[2]:5:3,' ',wr[3]:5:3,' ',(wr[4]*180/pi):5:3);
			WHILE ((wr[4]>0) or (wr[2]>=cily)) DO BEGIN
				{protoze cily>0, nestaci podminka while wr[2]>0;}
				{takze ve chvili, kdy uhel zacne byt zaporny - tedy}
				{v polovine letu - se zacne teprve ridit y souradnici}
				tn:=tn+h;
				RKstep(tn,c,g,wr);
				IF (fs='y') THEN WRITELN(fileout,tn:5:3,' ',wr[1]:5:3,' ',wr[2]:5:3,' ',wr[3]:5:3,' ',(wr[4]*180/pi):5:3);
			END;
			xf[i]:=wr[1]-cilx;
			IF (fs='y') THEN CLOSE(fileout);
		END;
		i:=3;
		WHILE (((abs(xf[3])>presnost) or (abs(wr[2]-cily)>presnost)) and (i<=45)) DO BEGIN
			{opakovane puli interval, dokud se nestrefi}
			{s pozadovanou presnosti nebo dokud neprekroci 45. opakovani}
			IF (fs='y') THEN BEGIN
				i:=i+1;
				Str(i,s);
				s2:='strel'+s+'.dat';
				ASSIGN(fileout,s2);
				REWRITE(fileout);
			END;
			IF(xf[3]<0) THEN BEGIN {zjisteni prestrelil/nedostrelil}
				xf[2]:=xf[3];
				u[2]:=u[3];
				u[3]:=(u[1]+u[2])/2;
			END ELSE BEGIN
				xf[1]:=xf[3];
				u[1]:=u[3];
				u[3]:=(u[1]+u[2])/2;
			END;
			tn:=0;
			wr[1]:=0;
			wr[2]:=0;
			wr[3]:=v;
			wr[4]:=u[3]/180*pi;
			IF (fs='y') THEN WRITELN(fileout,tn:5:3,' ',wr[1]:5:3,' ',wr[2]:5:3,' ',wr[3]:5:3,' ',(wr[4]*180/pi):5:3);
			WHILE ((wr[4]>0) or (wr[2]>=cily)) DO BEGIN
				tn:=tn+h;
				RKstep(tn,c,g,wr);
				IF (fs='y') THEN WRITELN(fileout,tn:5:3,' ',wr[1]:5:3,' ',wr[2]:5:3,' ',wr[3]:5:3,' ',(wr[4]*180/pi):5:3);
			END;
			xf[3]:=wr[1]-cilx;
			IF (fs='y') THEN CLOSE(fileout);
		END;
		WRITELN; {vysledek}
		WRITELN('Souradnice dopadu: [',wr[1]:5:3,'; ',wr[2]:5:3,'], elevacni uhel ',u[3]:5:3,'st.');
		IF ((abs(xf[3])>presnost) or (abs(wr[2]-cily)>presnost)) THEN BEGIN
			WRITELN('Cil NEBYL zasazen!');
		END ELSE BEGIN
			WRITELN('Cil zasazen!');
		END;
		REPEAT {jedem znovu?}
			WRITE('Znovu [y/n]? ');
			READLN(ans);
		UNTIL ((ans='y') or (ans='n'));
	UNTIL (ans='n');
END.
