GeoTessCPP
2.0.0
Software to facilitate storage and retrieval of 3D information about the Earth.
|
#include <GeoTessUtils.h>
Public Member Functions | |
GeoTessUtils () | |
virtual | ~GeoTessUtils () |
virtual int | class_size () const |
Static Public Member Functions | |
static string | class_name () |
static string | getVersion () |
static void | readString (string &s, ifstream &ifs) |
static void | writeString (ofstream &ofs, const string &s) |
static double | angle (const double *const v0, const double *const v1) |
static double | angleDegrees (const double *const v0, const double *const v1) |
static double | getDistance3D (const double *const v0, double r0, const double *const v1, double r1) |
static double | dot (const double *const v0, const double *const v1) |
static double | scalarTripleProduct (const double *const v0, const double *const v1, const double *const v2) |
static double | getEarthRadius (const double *const vector) |
static double | getGeoCentricLatitude (const double &lat) |
static double | getGeoGraphicLatitude (const double &lat) |
static double | getLat (const double *const vector) |
static double | getLon (const double *const vector) |
static double | getLatDegrees (const double *const vector) |
static double | getLonDegrees (const double *const vector) |
static string | getLatLonString (const double *const v) |
static double * | getVectorDegrees (const double &lat, const double &lon) |
static double * | getVector (const double &lat, const double &lon) |
static double * | getVector (const double &lat, const double &lon, double *v) |
static double * | getVectorDegrees (const double &lat, const double &lon, double *v) |
static double | azimuthDegrees (const double *const v1, const double *const v2, double errorValue) |
static double | azimuth (const double *const v1, const double *const v2, double errorValue) |
static double | normalize (double *const u) |
static void | cross (const double *const v1, const double *const v2, double *const rslt) |
static double * | crossNormal (const double *const u, const double *const v) |
static double | crossNormal (const double *const u, const double *const v, double *const w) |
static double | crossNorth (const double *const u, double *const w) |
static bool | vectorTripleProduct (const double *const v0, const double *const v1, const double *const v2, double *const rslt) |
static bool | vectorTripleProductNorthPole (const double *const u, double *const w) |
static bool | circumCenter (const double *const v0, const double *const v1, const double *const v2, double *const vs) |
static double * | circumCenter (const double *const v0, const double *const v1, const double *const v2) |
static bool | circumCenter (double const *const *const t, double *const vs) |
static bool | move (const double *const w, double distance, double azimuth, double *const u) |
static void | move (const double *const w, const double *const vtp, double a, double *const u) |
static bool | moveNorth (const double *const x, double distance, double *const z) |
static void | rotate (const double *const x, const double *const p, double a, double *const z) |
static double ** | getGreatCircle (const double *const v0, const double *const v1) |
static void | getGreatCircle (const double *const v0, const double *const v1, double **const gc) |
static double ** | getGreatCircle (const double *const v, double azimuth) |
static void | getGreatCircle (const double *const v, double azimuth, double **const gc) |
static void | getGreatCirclePoint (double const *const *const greatCircle, double distance, double *const v) |
static double * | getGreatCirclePoint (double const *const *const greatCircle, double distance) |
static double | getTriangleArea (const double *const v0, const double *const v1, const double *const v2) |
static double * | center (double const *const *const v, int n) |
static void | center (vector< double * > v, double *x) |
static double | length (const double *const u) |
static bool | isPole (const double *const u) |
static bool | parallel (const double *const u, const double *const v) |
static void | getTransform (const double *const u, const double *const v, double **const t) |
static void | transform (const double *x, double const *const *const transform, double *const g) |
Static Public Attributes | |
static bool | approximateLatitudes |
The Utils class provides basic static utility functions for GeoTess to manipulate geographic information.
|
inline |
Default constructor.
|
inlinevirtual |
Destructor.
|
inlinestatic |
Return the angular distance in radians between two unit vectors.
Return the angular distance in radians between two unit vectors.
v0 | a 3 component unit vector |
v1 | a 3 component unit vector |
|
inlinestatic |
Return the angular distance in degrees between two unit vectors.
v0 | a 3 component unit vector |
v1 | a 3 component unit vector |
|
static |
|
static |
Return azimuth from input vectors.
|
inlinestatic |
Return the normalized vector sum of the supplied unit vectors.
v | one or more unit vectors |
n | size of v |
|
inlinestatic |
Return the normalized vector sum of the supplied unit vectors.
v | one or more unit vectors |
x | the 3-element array of double in which to place the computed unit vector. |
|
inlinestatic |
Calculated the triangle circumcenter.
Given three unit vectors, v0, v1 and v2, find the circumcenter, vs. The circumcenter is the unit vector of the center of a small circle that has all three unit vectors on its circumference.
v0 | |
v1 | |
v2 | |
vs |
|
inlinestatic |
Given three unit vectors, v0, v1 and v2, find the circumcenter, vs. The circumcenter is the unit vector of the center of a small circle that has all three unit vectors on its circumference. Vectors must be specified in clockwise order.
v0 | |
v1 | |
v2 |
|
inlinestatic |
Given the three unit vectors, t[0], t[1] and t[2], find the circumcenter, vs. The circumcenter is the unit vector of the center of a small circle that has all three unit vectors on its circumference.
t | a 3 x 3 array of doubles that contains the three unit vectors of a triangle. |
vs |
|
inlinestatic |
Returns the class name.
|
inlinevirtual |
Returns the class size.
|
inlinestatic |
Vector cross product.
Cross product of two 3-component vectors. Result is not normalized.
v1 | vector<double> vector one. |
v2 | vector<double> vector two. |
rslt | set to v1 cross v2 Result is not a unit vector. |
|
inlinestatic |
Vector cross product with a normalized result.
Normalized cross product of two 3-component unit vectors.
u | vector one. |
v | vector two. |
|
inlinestatic |
Normalized cross product of two 3-component unit vectors.
u | vector one. |
v | vector two. |
w | set to u cross v, normalized to unit length. If u cross v has zero length, w will equal (0,0,0). |
|
inlinestatic |
Normalized cross product of a 3-component unit vector with the north pole.
Normalized cross product of a 3-component unit vector with the north pole.
u | vector<double> vector one. |
w | set to u cross north, normalized to unit length. If u cross north has zero length, w will equal (0,0,0). |
|
inlinestatic |
Dot product and scalar triple product.
Return the dot product of two vectors.
v0 | a 3 component vector |
v1 | a 3 component vector |
|
inlinestatic |
Returns the distance between point 0 (v0, r0) and 1 (v1, r1) assuming the vectors are unit vectors and the radii are in km then the result is in km.
Given two unit vectors and their radii, return the straight line separation between their tips. Assuming that the radii are in km, the result will also be in km.
v0 | Point 0 unit vector. |
r0 | Point 0 length (km). |
v1 | Point 1 unit vector. |
r1 | Point 1 length (km). |
|
inlinestatic |
Returns the Earth radius at the input 3D vector position.
Retrieve the radius of the Earth in km at the position specified by an Earth-centered unit vector. Uses the WGS84 ellipsoid.
v | Earth-centered unit vector |
|
inlinestatic |
Return latitude and longitude from the input vectors.
Return geocentric latitude given a geographic latitude
lat | geographic latitude in radians |
|
inlinestatic |
Return geographic latitude given a geocentric latitude
lat | geocentric latitude in radians |
|
static |
A great circle is defined by two unit vectors that are 90 degrees apart. A great circle is stored in a double[2][3] array, which is the structure returned by this method. A great circle can be passed to the method getGreatCirclePoint() to retrieve a unit vector that is on the great circle and located some distance from the first point of the great circle.
This method returns a great circle that is computed from two unit vectors that are not necessarily 90 degrees apart.
v0 | the first point on the great circle |
v1 | some other point that is also on the great circle but which is not necessarily 90 degrees away from v0. |
GeoTessException | if v0 and v1 are parallel. |
|
static |
A great circle is defined by two unit vectors that are 90 degrees apart. A great circle is stored in a double[2][3] array, which is the structure returned by this method. A great circle can be passed to the method getGreatCirclePoint() to retrieve a unit vector that is on the great circle and located some distance from the first point of the great circle.
This method returns a great circle that is computed from two unit vectors that are not necessarily 90 degrees apart.
v0 | the first point on the great circle |
v1 | some other point that is also on the great circle but which is not necessarily 90 degrees away from v0. |
gc | a 2 x 3 array specifying two unit vectors. The first one is a clone of unit vector v0 passed as first argument to this method. The second is located 90 degrees away from v0. |
GeoTessException | if v0 and v1 are parallel. |
|
static |
A great circle is defined by two unit vectors that are 90 degrees apart. A great circle is stored in a double[2][3] array, which is the structure returned by this method. A great circle can be passed to the method getGreatCirclePoint() to retrieve a unit vector that is on the great circle and located some distance from the first point of the great circle.
This method returns a great circle that is defined by an initial point and an azimuth.
v | a unit vector that will be the first point on the great circle. |
azimuth | a direction, in radians, in which to move relative to v in order to define the great circle |
GeoTessException | if v is located at north or south pole. |
|
static |
A great circle is defined by two unit vectors that are 90 degrees apart. A great circle is stored in a double[2][3] array, which is the structure returned by this method. A great circle can be passed to the method getGreatCirclePoint() to retrieve a unit vector that is on the great circle and located some distance from the first point of the great circle.
This method returns a great circle that is defined by an initial point and an azimuth.
v | a unit vector that will be the first point on the great circle. |
azimuth | a direction, in radians, in which to move relative to v in order to define the great circle |
gc | a 2 x 3 array specifying two unit vectors. The first one is a clone of unit vector v passed as an argument to this method. The second is located 90 degrees away from v in the direction specified by azimuth. |
GeoTessException | if v is located at north or south pole. |
|
inlinestatic |
A great circle is defined by two unit vectors that are 90 degrees apart. A great circle is stored in a double[2][3] array and one can be obtained by calling one of the getGreatCircle() methods.
In this method, a great circle and a distance are specified and a point is returned which is on the great circle path and is the specified distance away from the first point of the great circle.
greatCircle | a great circle structure |
distance | distance in radians from first point of great circle |
v | unit vector of point which is on great circle and located specified distance away from first point of great circle. |
|
inlinestatic |
A great circle is defined by two unit vectors that are 90 degrees apart. A great circle is stored in a double[2][3] array and one can be obtained by calling one of the getGreatCircle() methods.
In this method, a great circle and a distance are specified and a point is returned which is on the great circle path and is the specified distance away from the first point of the great circle.
greatCircle | a great circle structure |
distance | distance in radians from first point of great circle |
|
inlinestatic |
Convert a 3-component unit vector to geographic latitude, in radians.
v | 3-component unit vector |
|
inlinestatic |
Convert a 3-component unit vector to geographic latitude, in degrees.
v | 3-component unit vector |
|
static |
Return latitude / longitude as a string.
|
inlinestatic |
Convert a 3-component unit vector to a longitude, in radians.
v | 3 component unit vector |
|
inlinestatic |
Convert a 3-component unit vector to a longitude, in degrees.
v | 3 component unit vector |
|
static |
Transform is a 3 x 3 matrix such that when a vector is multiplied by transform, the vector will be projected onto the plane of this GreatCircle. The z direction will point out of the plane of the great circle in the direction of the observer (lastPoint cross firstPoint; parallel to normal). The y direction will correspond to the mean of firstPoint and lastPoint. The x direction will correspond to y cross z, forming a right handed coordinate system.
|
inlinestatic |
Get triangle area and centroid.
v0 | first corner of triangle |
v1 | second corner of triangle |
v2 | third corner of triangle |
|
inlinestatic |
Convert geographic lat, lon into a geocentric unit vector. The x-component points toward lat,lon = 0, 0. The y-component points toward lat,lon = 0, PI/2. The z-component points toward north pole.
lat | geographic latitude in radians. |
lon | longitude in radians. |
|
inlinestatic |
Convert geographic lat, lon into a geocentric unit vector. The x-component points toward lat,lon = 0, 0. The y-component points toward lat,lon = 0, PI/2 The z-component points toward north pole.
lat | geographic latitude in radians. |
lon | longitude in radians. |
v | 3-component unit vector. |
|
inlinestatic |
Convert geographic lat, lon into a geocentric unit vector.
Convert geographic lat, lon into a geocentric unit vector. The x-component points toward lat,lon = 0, 0. The y-component points toward lat,lon = 0, 90. The z-component points toward north pole.
lat | geographic latitude in degrees. |
lon | longitude in degrees. |
|
inlinestatic |
Convert geographic lat, lon into a geocentric unit vector. The x-component points toward lat,lon = 0, 0. The y-component points toward lat,lon = 0, 90. The z-component points toward north pole.
lat | geographic latitude in degrees. |
lon | longitude in degrees. |
v | 3 component unit vector. |
|
inlinestatic |
The current GeoTess version.
|
inlinestatic |
Returns true if unit vector u is very close to [0, 0, +/- 1]
Returns true if unit vector u is very close to [0, 0, +/- 1]
u | unit vector |
|
inlinestatic |
Return edge length.
Find the length of a 3-element vector.
u | double[] |
|
inlinestatic |
Move vector to a new position.
Move unit vector w specified distance in direction given by azimuth and return the result in u. If w is north or south pole, u will be equal to the same pole and method returns false.
w | double[] unit vector of starting position |
distance | distance to move in radians |
azimuth | direction to move in radians |
u | double[] unit vector of resulting position. |
|
inlinestatic |
Move unit vector w in direction of vtp by distance a and store result in u. vtp is assumed to be a unit vector normal to w on input.
w | double[] |
vtp | double[] |
a | double |
u | double[] |
|
inlinestatic |
Return a unit vector that is distance radians due north of positon x. If x is the north or south pole, then z is set equal to x.
x | the position to be moved. |
distance | the distance, in radians, that x is to be moved toward the north. |
z | the 3-element unit vector representing the position after having moved distance north. |
|
inlinestatic |
Normalize input vector.
Normalize the input vector to unit length. Returns the length of the vector prior to normalization.
u | vector<double> |
|
inlinestatic |
Returns true if unit vector u and v are parallel or very close to it
Returns true if unit vector u and v are parallel or very close to it
u | a unit vector |
v | another unit vector |
|
inlinestatic |
Read / write a binary string.
Read a string from the input file stream and set into s
|
static |
Rotate vector.
|
inlinestatic |
Calculate the scalar triple product of 3 3-component vectors: (v0 cross v1) dot v2
v0 | double[] |
v1 | double[] |
v2 | double[] |
|
inlinestatic |
Project vector x onto the plane of a great circle. Consider a great circle defined by two unti vectors, u and v. Find the transform of x by calling t = getTransform(u, v). Then call this method: transform(x, t, g), which will calculate unit vector g such that
Project vector x onto the plane of a great circle. Consider a great circle defined by two unti vectors, u and v. Find the transform of x by calling t = getTransform(u, v). Then call this method: transform(x, t, g), which will calculate unit vector g such that
x | double[] the 3 element array containing the vector to be projected. |
transform | the 3 x 3 transform matrix obtained by calling getTransform(u,v) |
g | double[] the projection of x onto plane of this GreatCircle |
GreatCircleException |
|
inlinestatic |
Vector triple product.
Compute the normalized vector triple product (v0 x v1) x v2 and store result in rslt. It is ok if rslt is a reference to one of the input vectors. Local variables are used to ensure memory is not corrupted.
v0 | double[] |
v1 | double[] |
v2 | double[] |
rslt | double[] |
|
inlinestatic |
Vector triple product with the north pole.
Compute the normalized vector triple product (u x northPole) x u and store result in w. Returns false is u is north or south pole.
u | double[] |
w | double[] |
|
inlinestatic |
Write the string s to the output file stream.
|
static |
If true, then an approximate algorithm will be used to convert back and forth between geocentric and geographic latitudes. The approximation incurs an error of about 0.1 meters in latitude calculations but is faster than the correct calculation.
Note that the existence of this static, mutable variable technically violates thread-safety of this class. But given the assumption that the approximation is just as good as the true conversions, this is not a significant violation.