# Unigine::Ellipsoid Class

Notice
The Ellipsoid class is available only in Sim version of Unigine Engine.

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.

### 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.

### 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.

### 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.

### 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.

## 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::vec3getNEDSurfacePoint(const Math::dvec3 & geodetic_origin, const Math::dvec3 & tangent_point)

Returns surface point by using tangent point coordinates.

### 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::vec3getNEDTangentPoint(const Math::dvec3 & geodetic_origin, const Math::dvec3 & surface_point)

Returns tangent point NED coordinates based on the geographical coordinates.

### 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.

### 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.

### 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).

### 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).

### 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.

NED coordinates.

## int MODE_ACCURATE

### Description

A calculation mode uses Vincenty's formula to calculate distances on the surface of the ellipsoid with a millimeter precision. It takes more time for calculation, but the accuracy of positioning is awesome.

## int MODE_FAST

### Description

A calculation mode is computed by using Great-circle distance formula. It works pretty fast, but you'll get positioning errors on big (~80000x80000 units) distances.
Last update: 2017-10-20