summaryrefslogtreecommitdiffstats
path: root/src/host/gsmmap/geo.c
blob: 65633d2c7a15c7cff23448be531a37c91a7869d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <math.h>
#include "geo.h"

void geo2space(double *x, double *y, double *z, double lon, double lat)
{
	*z = sin(lat / 180.0 * PI) * POLE_RADIUS;
	*x = sin(lon / 180.0 * PI) * cos(lat / 180.0 * PI) * EQUATOR_RADIUS;
	*y = -cos(lon / 180.0 * PI) * cos(lat / 180.0 * PI) * EQUATOR_RADIUS;
}

void space2geo(double *lon, double *lat, double x, double y, double z)
{
	double r;

	/* bring geoid to 1m radius */
	z = z / POLE_RADIUS;
	x = x / EQUATOR_RADIUS;
	y = y / EQUATOR_RADIUS;

	/* normalize */
	r = sqrt(x * x + y * y + z * z);
	z = z / r;
	x = x / r;
	y = y / r;

	*lat = asin(z) / PI * 180;
	*lon = atan2(x, -y) / PI * 180;
}

double distinspace(double x1, double y1, double z1, double x2, double y2,
	double z2)
{
	double x = x1 - x2;
	double y = y1 - y2;
	double z = z1 - z2;

	return sqrt(x * x + y * y + z * z);
}

double distonplane(double x1, double y1, double x2, double y2)
{
	double x = x1 - x2;
	double y = y1 - y2;

	return sqrt(x * x + y * y);
}