mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-01 21:56:43 +08:00
133 lines
3.7 KiB
C++
133 lines
3.7 KiB
C++
/* Copyright (C) 2013 VATSIM Community / contributors
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* This file incorporates work covered by the following copyright and
|
|
* permission notice:
|
|
* Copyright (c) Charles Karney (2008-2011) <charles@karney.com> and licensed
|
|
* under the MIT/X11 License. For more information, see
|
|
* http://geographiclib.sourceforge.net/
|
|
*/
|
|
|
|
#ifndef BLACKMISC_COORDINATETRANSFORMATION_H
|
|
#define BLACKMISC_COORDINATETRANSFORMATION_H
|
|
|
|
#include "blackmisc/coordinateecef.h"
|
|
#include "blackmisc/coordinatened.h"
|
|
#include "blackmisc/coordinategeodetic.h"
|
|
#include "blackmisc/mathmatrix3x3.h"
|
|
#include "blackmisc/mathematics.h"
|
|
|
|
namespace BlackMisc
|
|
{
|
|
namespace Geo
|
|
{
|
|
|
|
/*!
|
|
* \brief Coordinate transformation class between different systems
|
|
*/
|
|
class CCoordinateTransformation
|
|
{
|
|
private:
|
|
/*!
|
|
* \brief Equatorial radius of WGS84 ellipsoid (6378137 m)
|
|
* \return
|
|
*/
|
|
static const double &EarthRadiusMeters()
|
|
{
|
|
static double erm = 6378137.0;
|
|
return erm;
|
|
}
|
|
|
|
/*!
|
|
* \brief Flattening of WGS84 ellipsoid (1/298.257223563)
|
|
* \return
|
|
*/
|
|
static const double &Flattening()
|
|
{
|
|
static double f = 1.0 / 298.257223563;
|
|
return f;
|
|
}
|
|
|
|
/*!
|
|
* \brief First eccentricity squared
|
|
* \return
|
|
*/
|
|
static const double &e2()
|
|
{
|
|
static double e2 = (Flattening() * (2 - Flattening()));
|
|
return e2;
|
|
}
|
|
|
|
/*!
|
|
* \brief First eccentricity to power of four
|
|
* \return
|
|
*/
|
|
static const double &e4()
|
|
{
|
|
static double e4 = BlackMisc::Math::CMath::square(e2());
|
|
return e4;
|
|
}
|
|
|
|
/*!
|
|
* \brief First eccentricity squared absolute
|
|
* \return
|
|
*/
|
|
static const double &e2abs()
|
|
{
|
|
static double e2abs = qAbs(e2());
|
|
return e2abs;
|
|
}
|
|
|
|
/*!
|
|
* \brief Eccentricity e2m
|
|
* \return
|
|
*/
|
|
static const double &e2m()
|
|
{
|
|
static double e2m = BlackMisc::Math::CMath::square(1.0 - Flattening());
|
|
return e2m;
|
|
}
|
|
|
|
/*!
|
|
* \brief Default constructor, deleted
|
|
*/
|
|
CCoordinateTransformation();
|
|
|
|
public:
|
|
/*!
|
|
* \brief NED to ECEF
|
|
* \param ned
|
|
* \return
|
|
*/
|
|
static CCoordinateEcef toEcef(const CCoordinateNed &ned);
|
|
|
|
/*!
|
|
* \brief Geodetic to ECEF
|
|
* \param geo
|
|
* \return
|
|
*/
|
|
static CCoordinateEcef toEcef(const CCoordinateGeodetic &geo);
|
|
|
|
/*!
|
|
* \brief ECEF via Geodetic to NED
|
|
* \param ecef
|
|
* \param referencePosition
|
|
* \return
|
|
*/
|
|
static CCoordinateNed toNed(const CCoordinateEcef &ecef, const CCoordinateGeodetic &referencePosition);
|
|
|
|
/*!
|
|
* \brief ECEF to Geodetic
|
|
* \param ecef
|
|
* \return
|
|
*/
|
|
static CCoordinateGeodetic toGeodetic(const CCoordinateEcef &ecef);
|
|
};
|
|
|
|
} // namespace
|
|
} // namespace
|
|
|
|
#endif // guard
|