gtsam/gtsam/3rdparty/GeographicLib/dotnet/NETGeographicLib/LocalCartesian.cpp

181 lines
5.9 KiB
C++

/**
* \file NETGeographicLib/LocalCartesian.cpp
* \brief Implementation for NETGeographicLib::LocalCartesian class
*
* NETGeographicLib is copyright (c) Scott Heiman (2013)
* GeographicLib is Copyright (c) Charles Karney (2010-2012)
* <charles@karney.com> and licensed under the MIT/X11 License.
* For more information, see
* https://geographiclib.sourceforge.io/
**********************************************************************/
#include "stdafx.h"
#include "GeographicLib/LocalCartesian.hpp"
#include "LocalCartesian.h"
#include "Geocentric.h"
#include "NETGeographicLib.h"
using namespace NETGeographicLib;
const char BADALLOC[] = "Failed to allocate memory for a GeographicLib::LocalCartesian";
//*****************************************************************************
LocalCartesian::!LocalCartesian(void)
{
if ( m_pLocalCartesian != NULL )
{
delete m_pLocalCartesian;
m_pLocalCartesian = NULL;
}
}
//*****************************************************************************
LocalCartesian::LocalCartesian(double lat0, double lon0, double h0,
Geocentric^ earth )
{
try
{
const GeographicLib::Geocentric* pGeocentric =
reinterpret_cast<const GeographicLib::Geocentric*>(
earth->GetUnmanaged()->ToPointer() );
m_pLocalCartesian = new GeographicLib::LocalCartesian( lat0, lon0, h0, *pGeocentric );
}
catch ( std::bad_alloc )
{
throw gcnew GeographicErr( BADALLOC );
}
}
//*****************************************************************************
LocalCartesian::LocalCartesian(double lat0, double lon0, double h0 )
{
try
{
m_pLocalCartesian = new GeographicLib::LocalCartesian( lat0, lon0, h0,
GeographicLib::Geocentric::WGS84() );
}
catch ( std::bad_alloc )
{
throw gcnew GeographicErr( BADALLOC );
}
}
//*****************************************************************************
LocalCartesian::LocalCartesian(Geocentric^ earth)
{
try
{
const GeographicLib::Geocentric* pGeocentric =
reinterpret_cast<const GeographicLib::Geocentric*>(
earth->GetUnmanaged()->ToPointer() );
m_pLocalCartesian = new GeographicLib::LocalCartesian( *pGeocentric );
}
catch ( std::bad_alloc )
{
throw gcnew GeographicErr( BADALLOC );
}
}
//*****************************************************************************
LocalCartesian::LocalCartesian()
{
try
{
m_pLocalCartesian = new GeographicLib::LocalCartesian(
GeographicLib::Geocentric::WGS84() );
}
catch ( std::bad_alloc )
{
throw gcnew GeographicErr( BADALLOC );
}
}
//*****************************************************************************
void LocalCartesian::Reset(double lat0, double lon0, double h0 )
{
m_pLocalCartesian->Reset( lat0, lon0, h0 );
}
//*****************************************************************************
void LocalCartesian::Forward(double lat, double lon, double h,
[System::Runtime::InteropServices::Out] double% x,
[System::Runtime::InteropServices::Out] double% y,
[System::Runtime::InteropServices::Out] double% z)
{
double lx, ly, lz;
m_pLocalCartesian->Forward( lat, lon, h, lx, ly, lz );
x = lx;
y = ly;
z = lz;
}
//*****************************************************************************
void LocalCartesian::Forward(double lat, double lon, double h,
[System::Runtime::InteropServices::Out] double% x,
[System::Runtime::InteropServices::Out] double% y,
[System::Runtime::InteropServices::Out] double% z,
[System::Runtime::InteropServices::Out] array<double,2>^% M)
{
double lx, ly, lz;
std::vector<double> lM(9);
m_pLocalCartesian->Forward( lat, lon, h, lx, ly, lz, lM );
x = lx;
y = ly;
z = lz;
M = gcnew array<double,2>(3,3);
for ( int i = 0; i < 3; i++ )
for ( int j = 0; j < 3; j++ )
M[i,j] = lM[3*i+j];
}
//*****************************************************************************
void LocalCartesian::Reverse(double x, double y, double z,
[System::Runtime::InteropServices::Out] double% lat,
[System::Runtime::InteropServices::Out] double% lon,
[System::Runtime::InteropServices::Out] double% h)
{
double llat, llon, lh;
m_pLocalCartesian->Reverse( x, y, z, llat, llon, lh );
lat = llat;
lon = llon;
h = lh;
}
//*****************************************************************************
void LocalCartesian::Reverse(double x, double y, double z,
[System::Runtime::InteropServices::Out] double% lat,
[System::Runtime::InteropServices::Out] double% lon,
[System::Runtime::InteropServices::Out] double% h,
[System::Runtime::InteropServices::Out] array<double,2>^% M)
{
double llat, llon, lh;
std::vector<double> lM(9);
m_pLocalCartesian->Reverse( x, y, z, llat, llon, lh, lM );
lat = llat;
lon = llon;
h = lh;
M = gcnew array<double,2>(3,3);
for ( int i = 0; i < 3; i++ )
for ( int j = 0; j < 3; j++ )
M[i,j] = lM[3*i+j];
}
//*****************************************************************************
double LocalCartesian::LatitudeOrigin::get()
{ return m_pLocalCartesian->LatitudeOrigin(); }
//*****************************************************************************
double LocalCartesian::LongitudeOrigin::get()
{ return m_pLocalCartesian->LongitudeOrigin(); }
//*****************************************************************************
double LocalCartesian::HeightOrigin::get()
{ return m_pLocalCartesian->HeightOrigin(); }
//*****************************************************************************
double LocalCartesian::MajorRadius::get()
{ return m_pLocalCartesian->MajorRadius(); }
//*****************************************************************************
double LocalCartesian::Flattening::get()
{ return m_pLocalCartesian->Flattening(); }