ADD: new track message, Entity class and Position class

This commit is contained in:
Henry Winkel
2022-12-20 17:20:35 +01:00
parent 469ecfb099
commit 98ebb563a8
2114 changed files with 482360 additions and 24 deletions

View File

@@ -0,0 +1,163 @@
#include <iostream>
#include <iomanip>
#include <GeographicLib/EllipticFunction.hpp>
#include <GeographicLib/Ellipsoid.hpp>
#if defined(_MSC_VER)
// Squelch warnings about constant conditional expressions
# pragma warning (disable: 4127)
#endif
using namespace GeographicLib;
using namespace std;
int main() {
typedef GeographicLib::Math::real real;
try {
if (true) {
for (int i = -7; i <= 7; ++i) {
if (i == 0)
continue;
real a = 1, b = a * real(pow(real(2), i)), f = (a-b)/a;
Ellipsoid e(a, f);
real m = e.QuarterMeridian();
real na = a * real(1e7)/m, nb = na * (1-f);
Ellipsoid ne(na, f);
cout << b/a << " " << na << " " << nb << " "
<< ne.QuarterMeridian() << "\n";
}
for (int i = -1; i <= 1; ++i) {
if (i == 0)
continue;
real a = 1, b = a * real(pow(real(3), i)), f = (a-b)/a;
Ellipsoid e(a, f);
real m = e.QuarterMeridian();
real na = a * real(1e7)/m, nb = na * (1-f);
Ellipsoid ne(na, f);
cout << b/a << " " << na << " " << nb << " "
<< ne.QuarterMeridian() << "\n";
}
return 0;
}
if (false) {
// Longitude check
real a = real(1.5), b = 1, f = (a - b)/a,
e2 = (a*a - b*b)/(a*a), ep2 = (a*a - b*b)/(b*b),
alp0 = real(0.85), calp0 = cos(alp0), salp0 = sin(alp0),
k2 = ep2 * Math::sq(calp0), kp2 = k2/(1 + k2),
sigma = real(1.2), theta = atan(sqrt(1+k2) * tan(sigma)),
kap2 = Math::sq(calp0)/(1-Math::sq(salp0)*e2),
omg = atan(salp0 * tan(sigma)),
ups = atan(sqrt((1+ep2)/(1+k2*Math::sq(sin(sigma)))) * tan(omg)),
// psi = atan(sqrt((1+k2*Math::sq(sin(sigma)))/(1+ep2)) * tan(omg)),
psi = atan(sqrt((1-e2)/(1+k2*Math::sq(cos(theta)))) *
salp0*tan(theta));
EllipticFunction ella1(-k2, Math::sq(calp0));
EllipticFunction ella2(-k2, -ep2);
EllipticFunction ellb1(kp2, kap2);
EllipticFunction ellb2(kp2, e2);
EllipticFunction ellc(kp2, kp2);
cout << setprecision(15);
cout << (1 - f) * salp0 * ella1.G(sigma) << " "
<< ups - ep2/sqrt(1+ep2) * salp0 * ella2.H(sigma) << " "
<< (1-f) * sqrt(1-kp2) * salp0 * ellb1.Pi(theta) << " "
<< psi + (1-f) * sqrt(1-kp2) * salp0 *
(ellb2.F(theta) - ellb2.Pi(theta)) << "\n";
cout << b*ella1.E(sigma) << " "
<< b * sqrt(1-kp2) * ellc.Pi(theta) << " "
<< b / sqrt(1-kp2) *
(ellc.E(theta) - kp2 * cos(theta) * sin(theta)/
sqrt(1 - kp2*Math::sq(sin(theta)))) << "\n";
return 0;
}
if (false) {
real b = 1, a = 10,
e2 = (a*a - b*b)/(a*a), ep2 = (a*a - b*b)/(b*b);
EllipticFunction elle(e2, e2);
EllipticFunction ellep(-ep2, -ep2);
cout << fixed << setprecision(8);
for (int i = 0; i <= 90; i += 5) {
real
beta = i * Math::degree(),
phi = atan(sqrt(1 + ep2) * tan(beta)),
u = elle.F(phi),
y = b * ellep.E(beta),
M = a*elle.E();
cout << (y / M) * 90 << " "
<< i << " "
<< phi / Math::degree() << " "
<< (u / elle.K()) * 90 << "\n";
}
/* Create plot with
t=load('data.txt');
plot(t(:,1),t(:,1),'-k',...
t(:,1),t(:,2),'-kx',...
t(:,1),t(:,4),'-ko',...
t(:,1),t(:,3),'-k+')
axis equal;axis([0,90,0,90]);
title('meridian measures for a/b = 10');
xlabel('meridian distance (\circ)');
ylabel('measure (\circ)');
legend('distance',...
'parametric latitude',...
'elliptic variable',...
'geographic latitude',...
'Location','SouthEast');
set(gcf,'PaperSize',[4.5,4.5]);
set(gcf,'PaperPosition',[0,0,4.5,4.5]);
print meridian-measures.png -dpng
*/
return 0;
}
if (false) {
real alpha2 = real(0.8), k2 = real(-0.4);
EllipticFunction ellG(k2,alpha2);
EllipticFunction ellH(k2,k2/alpha2);
cout << setprecision(10);
for (int i = -179; i <= 180; i += 10) {
real
phi = i * Math::degree(),
sn = sin(phi), cn = cos(phi), dn = ellG.Delta(sn, cn),
g = ellG.G(phi),
h = (k2/alpha2)*ellH.H(phi) + sqrt(1-k2/alpha2)/sqrt(1-alpha2)*
atan2(sqrt(1-alpha2)*sqrt(1-k2/alpha2)*sn, dn*cn);
cout << i << " " << g << " " << h << " " << h-g << "\n";
}
return 0;
}
if (false) {
// For tabulated values in A+S
real
ASalpha = 30*Math::degree<real>(),
k2 = Math::sq(sin(ASalpha)),
alpha2 = real(0.3);
EllipticFunction ell(k2, alpha2);
real dphi = Math::degree();
cout << fixed << setprecision(10);
for (int i = 0; i <= 90; i += 15) {
real phi = i * dphi;
cout << i << " "
<< ell.F(phi) << " "
<< ell.E(phi) << " "
<< ell.D(phi) << " "
<< ell.Pi(phi) << " "
<< ell.G(phi) << " "
<< ell.H(phi) << "\n";
}
return 0;
}
}
catch (const exception& e) {
cerr << "Caught exception: " << e.what() << "\n";
return 1;
}
catch (...) {
cerr << "Caught unknown exception\n";
return 1;
}
return 0;
}