# Unigine::Ellipsoid Class

Warning
You should upgrade to Engineering / Sim SDK edition to use it.

The Ellipsoid class handles the geodetic transformations:

• Specifies the Ellipsoid settings: semimajor axis, flattening coefficient
• Performs systems coordinates (ECF, ENU, NED, Geodetic) conversion
• Solves direct and inverse geodetic problems with different calculation mode (Great Circle and Vincenty algorithms)

This class is used to create an Ellipsoid instance to the GeodeticPivot class.

Here is a code snippet of the Ellipsoid class usage:

Source code (C++)
#include "UnigineMathLib.h"
#include "UnigineGeodetics.h"
#include "UnigineEllipsoid.h"

using namespace Unigine;
using namespace Unigine::Math;

/* ... */

// define the geodetic origin
dvec3 tomsk_origin = dvec3(58.49771, 84.97437, 117.0);

// create a new GeodeticPivot object
GeodeticPivotPtr pivot = GeodeticPivot::create();

// create a new ellipsoid and specify its settings
EllipsoidPtr ellipsoid = pivot->getEllipsoid();
ellipsoid->setSemimajorAxis(80000.0f);
ellipsoid->setMode(Ellipsoid::MODE_FAST);

// set the ellipsoid to the pivot
pivot->setOrigin(tomsk_origin);
pivot->setEllipsoid(ellipsoid);

## static EllipsoidPtr create ( double semimajor_axis, double flattening ) #

Constructor. Creates a new Ellipsoid class instance with given flattening and semimajor axis.

### Arguments

• double semimajor_axis - Semimajor axis.
• double flattening - Flattening coefficient.

## static EllipsoidPtr create ( ) #

Constructor. Creates a new Ellipsoid class instance (WGS84 Ellipsoid).

## Math::dvec3getENUSurfacePoint ( const Math::dvec3 & geodetic_origin, const Math::dvec3 & tangent_point ) #

Returns surface point by using tangent point coordinates.
Notice
The Up-axis (Z+) direction in ENU points upward along the ellipsoid normal, while in UNIGINE implementation of ENU it goes from the Earth's center.

### Arguments

• const Math::dvec3 & geodetic_origin - The origin in ellipsoid coordinates (latitude (degrees), longitude (degrees) and altitude (meters).
• const Math::dvec3 & tangent_point - Tangent point coordinates to converted (curved) to surface coordinates (offset related to point of junction).

### Return value

Surface point coordinates.

## Math::dvec3getENUTangentPoint ( const Math::dvec3 & geodetic_origin, const Math::dvec3 & surface_point ) #

Returns tangent point ENU coordinates based on the geographical coordinates.
Notice
The Up-axis (Z+) direction in ENU points upward along the ellipsoid normal, while in UNIGINE implementation of ENU it goes from the Earth's center.

### Arguments

• const Math::dvec3 & geodetic_origin - The origin in ellipsoid coordinates (latitude (degrees), longitude (degrees) and altitude (meters).
• const Math::dvec3 & surface_point - Surface point coordinates to be converted (flatten) to tangent point (offset related to point of junction).

### Return value

Tangent point coordinates.

## Math::quatgetENUWorldRotation ( const Math::dvec3 & geodetic_origin ) #

Returns the world rotation quaternion in ENU coordinates.
Notice
The Up-axis (Z+) direction in ENU points upward along the ellipsoid normal, while in UNIGINE implementation of ENU it goes from the Earth's center.

### Arguments

• const Math::dvec3 & geodetic_origin - The origin in ellipsoid coordinates (latitude (degrees), longitude (degrees) and altitude (meters).

### Return value

World rotation in ENU coordinates.

## Math::dmat4getENUWorldTransform ( const Math::dvec3 & geodetic_origin ) #

Returns the world transformation matrix in ENU coordinates.
Notice
The Up-axis (Z+) direction in ENU points upward along the ellipsoid normal, while in UNIGINE implementation of ENU it goes from the Earth's center.

### Arguments

• const Math::dvec3 & geodetic_origin - The origin in ellipsoid coordinates (latitude (degrees), longitude (degrees) and altitude (meters).

### Return value

World transformation matrix in ENU coordinates.

## voidsetFlattening ( double flattening ) #

Sets new flattening for the ellipsoid.

### Arguments

• double flattening - Flattening coefficient of the ellipsoid. If the value is 0, the ellipsoid has a sphere shape, for 1 the ellipsoid has a circle (completely flat) shape.

## doublegetFlattening ( ) #

Returns flattening coefficient of the ellipsoid.

### Return value

Flattening coefficient of the ellipsoid.

Returns the mean radius of the ellipsoid.

### Return value

The mean radius of the ellipsoid.

## intisSupported ( ) #

Returns a value indicating if the geodetics feature is enabled.

### Return value

1 if the geodetics feature is enabled; otherwise, 0.

## voidsetMode ( int mode ) #

Sets the calculation mode.

### Arguments

• int mode - The variable of the calculation mode. It can be one of the following:

## intgetMode ( ) #

Returns the calculation mode int value: 1 if the mode is MODE_ACCURATE, 0 if the mode is MODE_FAST.

### Return value

1 if the mode is MODE_ACCURATE, 0 if the mode is MODE_FAST.

## Math::dvec3getNEDSurfacePoint ( const Math::dvec3 & geodetic_origin, const Math::dvec3 & tangent_point ) #

Returns surface point by using tangent point coordinates.
Notice
The Down-axis direction in NED points downward along the ellipsoid normal, while in UNIGINE implementation of NED it goes through the Earth's center.

### Arguments

• const Math::dvec3 & geodetic_origin - The origin in ellipsoid coordinates (latitude (degrees), longitude (degrees) and altitude (meters).
• const Math::dvec3 & tangent_point - Tangent point coordinates to converted (curved) to surface coordinates (offset related to point of junction).

### Return value

Surface point coordinates.

## Math::dvec3getNEDTangentPoint ( const Math::dvec3 & geodetic_origin, const Math::dvec3 & surface_point ) #

Returns tangent point NED coordinates based on the geographical coordinates.
Notice
The Down-axis direction in NED points downward along the ellipsoid normal, while in UNIGINE implementation of NED it goes through the Earth's center.

### Arguments

• const Math::dvec3 & geodetic_origin - The origin in ellipsoid coordinates (latitude (degrees), longitude (degrees) and altitude (meters).
• const Math::dvec3 & surface_point - Surface point coordinates to be converted (flatten) to tangent point (offset related to point of junction).

### Return value

Tangent point coordinates.

## Math::quatgetNEDWorldRotation ( const Math::dvec3 & geodetic_origin ) #

Returns the world rotation quaternion in NED coordinates.
Notice
The Down-axis direction in NED points downward along the ellipsoid normal, while in UNIGINE implementation of NED it goes through the Earth's center.

### Arguments

• const Math::dvec3 & geodetic_origin - The origin in ellipsoid coordinates (latitude (degrees), longitude (degrees) and altitude (meters).

### Return value

World rotation in NED coordinates.

## Math::dmat4getNEDWorldTransform ( const Math::dvec3 & geodetic_origin ) #

Returns the world transformation matrix in NED coordinates.
Notice
The Down-axis direction in NED points downward along the ellipsoid normal, while in UNIGINE implementation of NED it goes through the Earth's center.

### Arguments

• const Math::dvec3 & geodetic_origin - The origin in ellipsoid coordinates (latitude (degrees), longitude (degrees) and altitude (meters).

### Return value

World transformation matrix in NED coordinates.

## voidsetSemimajorAxis ( double axis ) #

Sets new semimajor axis of the ellipsoid.

### Arguments

• double axis - Semimajor axis length in units.

## doublegetSemimajorAxis ( ) #

Returns semimajor axis length of the ellipsoid in units.

### Return value

Semimajor axis of the ellipsoid.

## doublegetSemimajorEccentricitySqr ( ) #

Returns the squared eccentricity calculated along the semimajor axis.

### Return value

Squared eccentricity calculated along the semimajor axis.

## doublegetSemiminorAxis ( ) #

Returns semiminor axis of the ellipsoid in units.

### Return value

Semiminor axis of the ellipsoid in units.

## doublegetSemiminorEccentricitySqr ( ) #

Returns the squared eccentricity calculated along the semiminor axis.

### Return value

Squared eccentricity calculated along the semiminor axis.

## Math::dvec3solveGeodeticDirect ( const Math::dvec3 & geodetic_start, double bearing, double distance ) #

Solves the direct geodetic problem: calculates end point coordinates on the ellipsoid by using given start point, distance between points, and bearing value.

### Arguments

• const Math::dvec3 & geodetic_start - Start point on the ellipsoid.
• double bearing - Bearing value.
• double distance - Distance between two points on the ellipsoid.

## voidsolveGeodeticInverse ( const Math::dvec3 & geodetic_start, const Math::dvec3 & geodetic_end, double & bearing, double & distance ) #

Solves the inverse geodetic problem: calculates distance and bearing values by using given start and end points on the ellipsoid.

### Arguments

• const Math::dvec3 & geodetic_start - Start point on the ellipsoid.
• const Math::dvec3 & geodetic_end - End point on the ellipsoid.
• double & bearing - Variable to save the calculated bearing value.
• double & distance - Variable to save the calculated distance value.

## Math::dvec3toECF ( const Math::dvec3 & geodetic_coords ) #

Converts geodetic coordinates to Cartesian (ECF).

### Arguments

• const Math::dvec3 & geodetic_coords - Ellipsoid coordinates (latitude (degrees), longitude (degrees) and altitude (meters)) to be converted to Cartesian.

### Return value

Cartesian coordinates.

## Math::dvec3toENU ( const Math::dvec3 & geodetic_origin, const Math::dvec3 & geodetic_coords ) #

Converts geodetic coordinates to ENU (East, North, Up).
Notice
The Up-axis (Z+) direction in ENU points upward along the ellipsoid normal, while in UNIGINE implementation of ENU it goes from the Earth's center.

### Arguments

• const Math::dvec3 & geodetic_origin - The origin in ellipsoid coordinates (latitude (degrees), longitude (degrees) and altitude (meters).
• const Math::dvec3 & geodetic_coords - Coordinates to be converted to ENU.

ENU coordinates.

## Math::dvec3toGeodetic ( const Math::dvec3 & ecf_coords, int need_alt = 1 ) #

Converts Cartesian (ECF) coordinates to Ellipsoid.

### Arguments

• const Math::dvec3 & ecf_coords - Cartesian ECF coordinates to be converted.
• int need_alt - Flag indicating if altitude is to be calculated. 1 to calculate altitude, 0 - to skip altitude calculation.The default value is 1.

### Return value

Ellipsoid coordinates (latitude (degrees), longitude (degrees) and altitude (meters)

## Math::dvec3toNED ( const Math::dvec3 & geodetic_origin, const Math::dvec3 & geodetic_coords ) #

Converts geodetics coordinates to NED (North, East, Down).
Notice
The Down-axis direction in NED points downward along the ellipsoid normal, while in UNIGINE implementation of NED it goes through the Earth's center.

### Arguments

• const Math::dvec3 & geodetic_origin - The origin in ellipsoid coordinates (latitude (degrees), longitude (degrees) and altitude (meters).
• const Math::dvec3 & geodetic_coords - Coordinates to be converted to NED.

### Return value

NED coordinates.
Last update: 2021-04-01