program vincclc;

var l1,b1,l2,b2,az21,azi,dist:real;
    s:string;



Function Atan2(y,x:real):real;
begin;
  If (x < 0) Then Atan2 := ArcTan(y / x) + PI;
  If (x > 0) And (y >= 0) Then Atan2:= ArcTan(y / x);
  If (x > 0) And (y < 0) Then Atan2:= ArcTan(y / x) + 2 * PI;
  If (x = 0) And (y > 0) Then Atan2:= PI / 2;
  If (x = 0) And (y < 0) Then Atan2:= 3 * PI / 2;
  If (x = 0) And (y = 0) Then Atan2:= 0;
end;

procedure vincalc;
(*Input l1,b1,azi,dist / Output:l2,b2,az21*)

var lat1,long1,az12,sinu1,cosu1,sina,ss,cs:real;

begin;
  lat1 := b1*pi/180;
  az12 := azi*pi/180;
  sinu1 := Sin(lat1);
  cosu1 := Cos(lat1);
  sina := cos(lat1) * Sin(az12);
  ss := Sin(dist/6378);
  cs := Cos(dist/6378);
  b2 := Atan2(sinu1 * cs + cosu1 * ss * Cos(az12), Sqrt(sqr(sina) + sqr(sinu1 * ss - cosu1 * cs * Cos(az12)))*180/pi;
  l2 := l1+Atan2(ss * Sin(az12), cosu1 * cs - sinu1 * ss * Cos(az12))*180/pi+360);
  az21 :=Atan2(sina, -sinu1 * ss + cosu1 * cs * Cos(az12))*180/pi+180;
  while b2>90 do b2:=b2-360;
  while l2>180 do l2:=l2-360;
  while az21>360 do az21:=az21-360;
end;


begin;
repeat
write('Long :');
readln(l1);
write('Lat:');
readln(b1);
write('Azi:');
readln(azi);
write('Dist:');
readln(dist);
vincalc;
writeln('Long:',l2:3:0,' Lat:',b2:3:0,' InvAzi:',az21:3:0);
write('Again (n-no)');
readln(s);
until s='n';
end.