Cообщений: 100
Регистрация: 10.11.2008
|
Здравствуйте!
| Код |
|---|
const
rad : extended = 180 / pi;
radr : extended = pi / 180;
// Красовский 42
a_kr = 6378245.0; // большая полуось (экваториальный радиус), м
c_kr = 1/298.3; // (a-b)/a (сжатие эллипсоида)
e2_kr = 2*c_kr - c_kr*c_kr; // (a2-b2)/a2 (квадрат эксцентриситета)
b_kr = 6356863.0; // малая (полярная) полуось, м
function sk_get_lgeo42_bess(f1,t1,f2,t2: double; var s,a12,a21: double): boolean;
var b1,l1,b2,l2,l,w,wi,dw,tb1,tb2,u1,u2,a1,a2,x,y,m,g,g1,k,q,dq,a,b,c,d,alf,bet,gam: extended;
// PEШEHИE OБPATHOЙ ГEOДEЗИЧECKOЙ ЗAДAЧИ HA ЭЛЛИПCOИДE METOДOM БECCEЛЯ
// -> a_kr - ПOЛУOCЬ ЭЛЛИПCOИДA B METPAX, e2_kr - KBAДPAT ЭKCЦEHTPИCИTETA;
// -> B1,L1,B2,L2 - ГEOДEЗИЧECKИE KOOPДИHATЫ TOЧEK B ГРАДУСАХ;
// <- s - ДЛИHA ГЕОЛИНИИ B METPAX;
// <- A12 И A21 ПPЯMOЙ И OБPATHЫЙ ГEOДEЗИЧECKИЙ AЗИMУT В ГРАДУСАХ.
begin // (на эллипсоиде Красовского)
Result := false;
if (abs(f1-f2)<1e-5) and (abs(t1-t2)<1e-5) then begin s := 0; a12 := 0; a21 := 0; exit; end;
if (t1 > 89.9) then t1 := 89.9 else if (t1 < -89.9) then t1 := -89.9;
if (t2 > 89.9) then t2 := 89.9 else if (t2 < -89.9) then t2 := -89.9;
while (f1 < -180) do f1 := f1 + 360; while (f1 > 360) do f1 := f1 - 360;
while (f2 < -180) do f2 := f2 + 360; while (f2 > 360) do f2 := f2 - 360;
b1 := t1 * radr; l1 := f1 * radr;
b2 := t2 * radr; l2 := f2 * radr;
l := l2 - l1; tb2 := sin(b2)/cos(b2); tb1 := sin(b1)/cos(b1);
u1 := arctan(sqrt(1 - e2_kr) * tb1);
u2 := arctan(sqrt(1 - e2_kr) * tb2);
w := l;
while (true) do
begin
x := sin((u2-u1)/2); y := sin(w/2)/cos(w/2) * cos((u2+u1)/2); a1 := mp_atan_2(x, y);
x := cos((u2-u1)/2); y := sin(w/2)/cos(w/2) * sin((u2+u1)/2); a2 := mp_atan_2(x, y);
a12 := a1 - a2; while (a12 < 0) do a12 := a12 + 2*pi;
a21 := a1 + a2 + pi; while (a21 >= 2*pi) do a21 := a21 - 2*pi;
m := arctan(sin(u1)/cos(u1)/cos(a12)); g1 := sin(a12) * cos(u1);
if (abs(sin(m)) > abs(cos(m)))
then g := sin(u1) / sin(m)
else g := cos(u1) * cos(a12) / cos(m);
if (abs(sin(a12)) >= abs(cos(a12)))
then y := cos(u2) * sin(w) / sin(a12)
else y := (sin(u2)*cos(u1) - cos(u2)*sin(u1)*cos(w)) / cos(a12);
x := sin(u1)*sin(u2) + cos(u1)*cos(u2)*cos(w);
q := mp_atan_2(x, y);
k := (e2_kr/(1-e2_kr)) * g * g;
a := ((5/4*k - 3)/64*k + 0.25) * k + 1;
b := (((15*k)/512 - (1/16)) * k + 0.25) * k;
c := (1 - 0.75*k)/128 * k * k;
d := k * k * k / 1536;
dq := b*sin(q)*cos(2*m+q) + c*sin(2*q)*cos(2*(2*m+q)) + d*sin(3*q)*cos(3*(2*m+q));
alf := ((e2_kr/2 + 1)*e2_kr*0.125 - (e2_kr+1)*e2_kr*g*g*0.0625 + 0.5) * e2_kr;
bet := ((1-g*g*0.5)*e2_kr + 1)*g*g*e2_kr*e2_kr*0.0625;
gam := ((e2_kr*g)*(e2_kr*g)*(e2_kr*g)*g)/256;
dw := ( alf*q + bet*sin(q)*cos(2*m+q) + gam*sin(2*q)*cos(2*(2*m+q)) ) * g1;
wi := l + dw;
dw := wi - w;
w := wi;
if (abs(dw) < 1e-13) then
begin
s := a_kr * sqrt(1-e2_kr) * (a*q - dq);
a12 := a12 * rad; a21 := a21 * rad;
break;
end;
end;
Result := true;
end;
function sk_get_f2t242_bess(f1,t1,s,a12: double; var f2,t2,a21: double): boolean;
var b1,l1,b2,l2,l,w,dw,tb1,u1,u2,x,y,m,g,g1,k,q,dq,si,a,b,c,d,alf,bet,gam: extended;
label mm1;
// PEШEHИE ПPЯMOЙ ГEOДEЗИЧECKOЙ ЗAДAЧИ HA ЭЛЛИПCOИДE METOДOM БECCEЛЯ
// -> a_kr - ПOЛУOCЬ ЭЛЛИПCOИДA B METPAX, e2_kr - KBAДPAT ЭKCЦEHTPИCИTETA;
// -> B1,L1 - ГEOДEЗИЧECKИE KOOPДИHATЫ 1-OЙ TOЧKИ B ГРАДУСАХ; s - ДЛИHA ГЕОЛИНИИ В МЕTPAX;
// -> A12 - ПPЯMOЙ ГEOДEЗИЧECKИЙ AЗИMУT B ГРАДУСАХ;
// <- B2,L2 - ГEOДEЗИЧECKИE KOOPДИHATЫ 2-OЙ TOЧKИ;
// <- A21 - OБPATHЫЙ ГEOДEЗИЧECKИЙ AЗИMУT B ГРАДУСАХ.
begin
Result := false;
if (abs(s) < 1e-1) then begin f2 := f1; t2 := t1; a21 := 0; exit; end;
while (a12 < 0) do a12 := a12 + 360; while (a12 > 360) do a12 := a12 - 360;
a12 := a12 * radr;
if (t1 > 89.9) then t1 := 89.9 else if (t1 < -89.9) then t1 := -89.9;
while (f1 < -180) do f1 := f1 + 360; while (f1 > 360) do f1 := f1 - 360;
b1 := t1 * radr; l1 := f1 * radr; tb1 := sin(b1)/cos(b1);
u1 := arctan(sqrt(1 - e2_kr) * tb1);
m := arctan(sin(u1)/cos(u1)/cos(a12)); g1 := sin(a12) * cos(u1);
if (abs(sin(m)) > abs(cos(m)))
then g := sin(u1) / sin(m)
else g := cos(u1) * cos(a12) / cos(m);
si := 0;
k := (e2_kr/(1-e2_kr)) * g * g;
a := ((5/4*k - 3)/64*k + 0.25) * k + 1;
b := (((15*k)/512 - (1/16)) * k + 0.25) * k;
c := (1 - 0.75*k)/128 * k * k;
d := k * k * k / 1536;
mm1:
dq := b*sin(si)*cos(2*m+si) + c*sin(2*si)*cos(2*(2*m+si)) + d*sin(3*si)*cos(3*(2*m+si));
q := (s / (a_kr * sqrt(1-e2_kr)) + dq) / a;
if (abs(si-q) > 1e-13) then begin si := q; goto mm1; end;
u2 := arcsin(g * sin(m+q));
w := mp_atan_2(cos(q)-sin(u1)*sin(u2), sin(q)*sin(a12)*cos(u1));
a21 := mp_atan_2(-g*cos(m+q)*sin(q), -cos(u1)*sin(w)*cos(u2));
while (a21 < 0) do a21 := a21 + 2*pi; while (a21 >= 2*pi) do a21 := a21 - 2*pi;
b2 := arctan(sin(u2) / cos(u2) / sqrt(1-e2_kr));
alf := ((e2_kr/2 + 1)*e2_kr*0.125 - (e2_kr+1)*e2_kr*g*g*0.0625 + 0.5) * e2_kr;
bet := ((1 - g*g*0.5)*e2_kr + 1)*g*g*e2_kr*e2_kr*0.0625;
gam := ((e2_kr*g)*(e2_kr*g)*(e2_kr*g)*g)/256;
dw := (alf*q + bet*sin(q)*cos(2*m+q) + gam*sin(2*q)*cos(2*(2*m+q))) * g1;
l2 := l1 + w - dw;
while (l2 < 0) do l2 := l2 + 2*pi; while (l2 >= 2*pi) do l2 := l2 - 2*pi;
a21 := a21 * rad; f2 := l2 * rad; t2 := b2 * rad;
Result := true;
end;
|
С Уважением, Болотов В.И.
|