# `geoid.c`

Functions:- | Provides conversion between the ECEF and WGS84 co-ordinate reference systems.
--- | ---
Notes based on code as of Mon Apr 5 21:38:06 2010 -0400.
`static double bilinear(double x1, double y1, double x2, double y2, double x, double y, double z11, double z12, double z21, double z22)` | This is a piece of mathematical manipulation only used internally in this code, so wrestle with it if you will! It's used to perform bilinear interpolation on the grid points in the WGS4 geoidal-separation array.
`double wgs84_separation(double lat, double lon)` | This is used by drivers to get the separation of MSL from the WGS84 datum at a pair of Latitude/Longitude co-ordinates. The data is in a pre-defined table.
`void ecef_to_wgs84fix(struct gps_data_t *gpsdata, double x, double y, double z, double vx, double vy, double vz, float *separation)` | This does exactly what it says! Co-ordinate system conversion from ecef to the wgs84 equivalent. Geodetic separation for the fix is left in *separation
`static double fix_minuz(double d)` | This forces a value of -0.0 to be the same as 0.0 so that certain trig functions act in a predictable manner.
`int main(int argc, char **argv)` | This is a local test routine which exercises the other code for debugging purposes. It is normally shut off by an `#ifdef`.