и опять о расстоянии меж точками (+)
Правила форума
Для предотврашения спама первые сообщения вновь зарегистрированных пользователей проходят ручную премодерацию.
Для предотврашения спама первые сообщения вновь зарегистрированных пользователей проходят ручную премодерацию.
|
||
:)
А я поверил :)
не, проблема не в этом :) было бы очень просто!
не, проблема не в этом :) было бы очень просто!
#":&@!!!
А зря...
----------------------------------------------
const double c_A = 6378137;
const double c_a = 1/298.257223563;
const double c_e2 = 2*c_a - c_a*c_a;
float Distance (const point_t & _1, const point_t & _2) {
const double fSinB1 = ::sin (_1.y*c_PI/180);
const double fCosB1 = ::cos (_1.y*c_PI/180);
const double fSinL1 = ::sin (_1.x*c_PI/180);
const double fCosL1 = ::cos (_1.x*c_PI/180);
const double N1 = c_A/::sqrt (1 - c_e2*fSinB1*fSinB1);
const double X1 = N1*fCosB1*fCosL1;
const double Y1 = N1*fCosB1*fSinL1;
const double Z1 = (1 - c_e2)*N1*fSinB1;
const double fSinB2 = ::sin (_2.y*c_PI/180);
const double fCosB2 = ::cos (_2.y*c_PI/180);
const double fSinL2 = ::sin (_2.x*c_PI/180);
const double fCosL2 = ::cos (_2.x*c_PI/180);
const double N2 = c_A/::sqrt (1 - c_e2*fSinB2*fSinB2);
const double X2 = N2*fCosB2*fCosL2;
const double Y2 = N2*fCosB2*fSinL2;
const double Z2 = (1 - c_e2)*N2*fSinB2;
const double D = ::sqrt ((X1 - X2)*(X1 - X2) + (Y1 - Y2)*(Y1 - Y2) + (Z1 - Z2)*(Z1 - Z2));
const double R = c_A;
const double D2 = 2*R*::asin (.5*D/R);
return D2;
}
void main () {
point_t pt1 (36.91672f, 55.73837f);
point_t pt2 (37.35804f, 57.14513f);
cout << Distance (pt1, pt2);
}
----------------------------------------------
Выдает, между прочим, 158,989 км. А если широту с долготой переставить - 130 км.
И еще: разница между хордой D и дугой D2 на таком расстоянии составляет лишь 4 метра.
"Разморозьте курицу" (с) Boeing
----------------------------------------------
const double c_A = 6378137;
const double c_a = 1/298.257223563;
const double c_e2 = 2*c_a - c_a*c_a;
float Distance (const point_t & _1, const point_t & _2) {
const double fSinB1 = ::sin (_1.y*c_PI/180);
const double fCosB1 = ::cos (_1.y*c_PI/180);
const double fSinL1 = ::sin (_1.x*c_PI/180);
const double fCosL1 = ::cos (_1.x*c_PI/180);
const double N1 = c_A/::sqrt (1 - c_e2*fSinB1*fSinB1);
const double X1 = N1*fCosB1*fCosL1;
const double Y1 = N1*fCosB1*fSinL1;
const double Z1 = (1 - c_e2)*N1*fSinB1;
const double fSinB2 = ::sin (_2.y*c_PI/180);
const double fCosB2 = ::cos (_2.y*c_PI/180);
const double fSinL2 = ::sin (_2.x*c_PI/180);
const double fCosL2 = ::cos (_2.x*c_PI/180);
const double N2 = c_A/::sqrt (1 - c_e2*fSinB2*fSinB2);
const double X2 = N2*fCosB2*fCosL2;
const double Y2 = N2*fCosB2*fSinL2;
const double Z2 = (1 - c_e2)*N2*fSinB2;
const double D = ::sqrt ((X1 - X2)*(X1 - X2) + (Y1 - Y2)*(Y1 - Y2) + (Z1 - Z2)*(Z1 - Z2));
const double R = c_A;
const double D2 = 2*R*::asin (.5*D/R);
return D2;
}
void main () {
point_t pt1 (36.91672f, 55.73837f);
point_t pt2 (37.35804f, 57.14513f);
cout << Distance (pt1, pt2);
}
----------------------------------------------
Выдает, между прочим, 158,989 км. А если широту с долготой переставить - 130 км.
И еще: разница между хордой D и дугой D2 на таком расстоянии составляет лишь 4 метра.
"Разморозьте курицу" (с) Boeing
И еще одна проверка
Действительно, Ozi дает относительную погрешность в определении расстояния между waypoints в пределах десятых долей процента.
Решил проверить при больших расстояниях. Откопал в учебнике по высшей геодезии формулы для решения обратной геодезической задачи на эллипсоиде Красовского,
набросал аналогичную функцию на C, проверил коэффициенты по контрольным примерам (а это самое большое мучение - найти, где в книге допущена опечатка) Нет, кажется сошлось.
Значит, так: между точками
A (широта 60 градусов; долгота 30 градусов) и
B (53 ; 158 градусов) (координаты на эллипсоиде Красовского)
геодезическая линия имеет длину 6647.086 км.
OziExplorer дает 6653.9628 км.
Полагаю, дело в коэффициентах, положенных в основу. Наверное, как и написано,
это расстояние по дуге окружности. Только вот какой радиус положил в основу автор? - наверное, поэтому и расхождение.
Решил проверить при больших расстояниях. Откопал в учебнике по высшей геодезии формулы для решения обратной геодезической задачи на эллипсоиде Красовского,
набросал аналогичную функцию на C, проверил коэффициенты по контрольным примерам (а это самое большое мучение - найти, где в книге допущена опечатка) Нет, кажется сошлось.
Значит, так: между точками
A (широта 60 градусов; долгота 30 градусов) и
B (53 ; 158 градусов) (координаты на эллипсоиде Красовского)
геодезическая линия имеет длину 6647.086 км.
OziExplorer дает 6653.9628 км.
Полагаю, дело в коэффициентах, положенных в основу. Наверное, как и написано,
это расстояние по дуге окружности. Только вот какой радиус положил в основу автор? - наверное, поэтому и расхождение.
:o)
Сыплю голову пеплом :)
Ну у меня всегда такие ошибки, серьезного мало, а гемороя много :)
Я наивный албанец просто не стал учитывать Z координату, так как откровенно пологал, что при переводе в прямоугольные координаты, да еще без учета высоты третья координата не нужна :)
Между делом, раскопал астрономическую методику подсчета координат, так там предлагается, для территории России делать поправку в 11 минут, тогда точность вроде как возрастает при испльзовании экваториального радиуса.
Теперь понятно, почему гориозонтали лучше считались, чем вертикали :)
Искрене прошу прощения за потраченное время! Но то, что одним умнее больше стало, то смело заслугу приписывай на свое имя!
СПАСИБО!
Ну у меня всегда такие ошибки, серьезного мало, а гемороя много :)
Я наивный албанец просто не стал учитывать Z координату, так как откровенно пологал, что при переводе в прямоугольные координаты, да еще без учета высоты третья координата не нужна :)
Между делом, раскопал астрономическую методику подсчета координат, так там предлагается, для территории России делать поправку в 11 минут, тогда точность вроде как возрастает при испльзовании экваториального радиуса.
Теперь понятно, почему гориозонтали лучше считались, чем вертикали :)
Искрене прошу прощения за потраченное время! Но то, что одним умнее больше стало, то смело заслугу приписывай на свое имя!
СПАСИБО!
|
||
Кто сейчас на конференции
Сейчас этот форум просматривают: Bing [Bot] и 148 гостей