aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/map/libmap/elliptic.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/map/libmap/elliptic.c')
-rw-r--r--src/cmd/map/libmap/elliptic.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/cmd/map/libmap/elliptic.c b/src/cmd/map/libmap/elliptic.c
new file mode 100644
index 00000000..3f3b1d57
--- /dev/null
+++ b/src/cmd/map/libmap/elliptic.c
@@ -0,0 +1,35 @@
+#include <u.h>
+#include <libc.h>
+#include "map.h"
+
+struct coord center;
+
+static int
+Xelliptic(struct place *place, double *x, double *y)
+{
+ double r1,r2;
+ r1 = acos(place->nlat.c*(place->wlon.c*center.c
+ - place->wlon.s*center.s));
+ r2 = acos(place->nlat.c*(place->wlon.c*center.c
+ + place->wlon.s*center.s));
+ *x = -(r1*r1 - r2*r2)/(4*center.l);
+ *y = (r1*r1+r2*r2)/2 - (center.l*center.l+*x**x);
+ if(*y < 0)
+ *y = 0;
+ *y = sqrt(*y);
+ if(place->nlat.l<0)
+ *y = -*y;
+ return(1);
+}
+
+proj
+elliptic(double l)
+{
+ l = fabs(l);
+ if(l>89)
+ return(0);
+ if(l<1)
+ return(Xazequidistant);
+ deg2rad(l,&center);
+ return(Xelliptic);
+}