diff options
Diffstat (limited to 'src/cmd/map/libmap/harrison.c')
-rw-r--r-- | src/cmd/map/libmap/harrison.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/cmd/map/libmap/harrison.c b/src/cmd/map/libmap/harrison.c new file mode 100644 index 00000000..6b6003c2 --- /dev/null +++ b/src/cmd/map/libmap/harrison.c @@ -0,0 +1,40 @@ +#include <u.h> +#include <libc.h> +#include "map.h" + +static double v3,u2,u3,a,b; /*v=view,p=obj,u=unit.y*/ + +static int +Xharrison(struct place *place, double *x, double *y) +{ + double p1 = -place->nlat.c*place->wlon.s; + double p2 = -place->nlat.c*place->wlon.c; + double p3 = place->nlat.s; + double d = b + u3*p2 - u2*p3; + double t; + if(d < .01) + return -1; + t = a/d; + if(v3*place->nlat.s < 1.) + return -1; + *y = t*p2*u2 + (v3-t*(v3-p3))*u3; + *x = t*p1; + if(t < 0) + return 0; + if(*x * *x + *y * *y > 16) + return -1; + return 1; +} + +proj +harrison(double r, double alpha) +{ + u2 = cos(alpha*RAD); + u3 = sin(alpha*RAD); + v3 = r; + b = r*u2; + a = 1 + b; + if(r<1.001 || a<sqrt(r*r-1)) + return 0; + return Xharrison; +} |