прямая задача
[CODE]function TrueGeoTask(Bo, Lo, Azim, Dist: double): T3dPoint;
var sinAzim, cosAzim : double;
tanU1,cosU1,sinU1 : double;
sinA,cosSqA,A,B : double;
sg1,sig,dsg,psig,uSq : double;
cos2sM ,sinSg, cosSg: double;
begin
sinAzim := sin(Azim);
cosAzim := cos(Azim);
tanU1 := (1-eWGS84.rf) * tan(Bo);
cosU1 := 1 / sqrt(1 + tanU1*tanU1);
sinU1 := tanU1 * cosU1;
sg1 := arctan2(tanU1, cosAzim);
sinA := cosU1 * sinAzim;
cosSqA := 1 - sinA*sinA;
uSq := cosSqA*(eWGS84.a*eWGS84.a-eWGS84.b*eWGS84.b)/(eWGS84.b*eWGS84.b);
A := 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));
B := uSq/1024*(256+uSq*(-128+uSq*(74-47*uSq)));
sig := Dist/(eWGS84.b * A); psig := 0;
repeat
cos2sM := cos(2*sg1 + sig);
sinSg := sin(sig);
cosSg := cos(sig);
dsg := B*sinSg*(cos2sM+0.25*B*(cosSg*(-1+2*cos2sM*cos2sM)-
B/6*cos2sM*(-3+4*sinSg*sinSg)*(-3+4*cos2sM*cos2sM)));
psig := sig;
sig := Dist / (eWGS84.b*A) + dsg;
until (abs(sig-psig) <= 1E-12);
A := eWGS84.rf/16*cosSqA*(4+eWGS84.rf*(4-3*cosSqA));
B := sinU1*sinSg - cosU1*cosSg*cosAzim;
result.B := arctan2(sinU1*cosSg + cosU1*sinSg*cosAzim, (1-eWGS84.rf)*sqrt(sinA*sinA + B*B));
result.L := Lo+ arctan2(sinSg*sinAzim, cosU1*cosSg - sinU1*sinSg*cosAzim) -
(1-A) * eWGS84.rf * sinA * (sig + A*sinSg*(cos2sM+A*cosSg*(-1+2*cos2sM*cos2sM)));
result.Z := arctan2(sinA, -B);
end;
[/CODE]
[CODE]function TrueGeoTask(Bo, Lo, Azim, Dist: double): T3dPoint;
var sinAzim, cosAzim : double;
tanU1,cosU1,sinU1 : double;
sinA,cosSqA,A,B : double;
sg1,sig,dsg,psig,uSq : double;
cos2sM ,sinSg, cosSg: double;
begin
sinAzim := sin(Azim);
cosAzim := cos(Azim);
tanU1 := (1-eWGS84.rf) * tan(Bo);
cosU1 := 1 / sqrt(1 + tanU1*tanU1);
sinU1 := tanU1 * cosU1;
sg1 := arctan2(tanU1, cosAzim);
sinA := cosU1 * sinAzim;
cosSqA := 1 - sinA*sinA;
uSq := cosSqA*(eWGS84.a*eWGS84.a-eWGS84.b*eWGS84.b)/(eWGS84.b*eWGS84.b);
A := 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));
B := uSq/1024*(256+uSq*(-128+uSq*(74-47*uSq)));
sig := Dist/(eWGS84.b * A); psig := 0;
repeat
cos2sM := cos(2*sg1 + sig);
sinSg := sin(sig);
cosSg := cos(sig);
dsg := B*sinSg*(cos2sM+0.25*B*(cosSg*(-1+2*cos2sM*cos2sM)-
B/6*cos2sM*(-3+4*sinSg*sinSg)*(-3+4*cos2sM*cos2sM)));
psig := sig;
sig := Dist / (eWGS84.b*A) + dsg;
until (abs(sig-psig) <= 1E-12);
A := eWGS84.rf/16*cosSqA*(4+eWGS84.rf*(4-3*cosSqA));
B := sinU1*sinSg - cosU1*cosSg*cosAzim;
result.B := arctan2(sinU1*cosSg + cosU1*sinSg*cosAzim, (1-eWGS84.rf)*sqrt(sinA*sinA + B*B));
result.L := Lo+ arctan2(sinSg*sinAzim, cosU1*cosSg - sinU1*sinSg*cosAzim) -
(1-A) * eWGS84.rf * sinA * (sig + A*sinSg*(cos2sM+A*cosSg*(-1+2*cos2sM*cos2sM)));
result.Z := arctan2(sinA, -B);
end;
[/CODE]