xref: /plan9/sys/src/cmd/map/libmap/harrison.c (revision 59cc4ca53493a3c6d2349fe2b7f7c40f7dce7294)
1*59cc4ca5SDavid du Colombier #include <u.h>
2*59cc4ca5SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include "map.h"
43e12c5d1SDavid du Colombier 
5219b2ee8SDavid du Colombier static double v3,u2,u3,a,b; /*v=view,p=obj,u=unit.y*/
63e12c5d1SDavid du Colombier 
73e12c5d1SDavid du Colombier static int
Xharrison(struct place * place,double * x,double * y)8219b2ee8SDavid du Colombier Xharrison(struct place *place, double *x, double *y)
93e12c5d1SDavid du Colombier {
10219b2ee8SDavid du Colombier 	double p1 = -place->nlat.c*place->wlon.s;
11219b2ee8SDavid du Colombier 	double p2 = -place->nlat.c*place->wlon.c;
12219b2ee8SDavid du Colombier 	double p3 = place->nlat.s;
13219b2ee8SDavid du Colombier 	double d = b + u3*p2 - u2*p3;
14219b2ee8SDavid du Colombier 	double t;
153e12c5d1SDavid du Colombier 	if(d < .01)
16219b2ee8SDavid du Colombier 		return -1;
173e12c5d1SDavid du Colombier 	t = a/d;
183e12c5d1SDavid du Colombier 	if(v3*place->nlat.s < 1.)
193e12c5d1SDavid du Colombier 		return -1;
203e12c5d1SDavid du Colombier 	*y = t*p2*u2 + (v3-t*(v3-p3))*u3;
213e12c5d1SDavid du Colombier 	*x = t*p1;
22219b2ee8SDavid du Colombier 	if(t < 0)
233e12c5d1SDavid du Colombier 		return 0;
24219b2ee8SDavid du Colombier 	if(*x * *x + *y * *y > 16)
25219b2ee8SDavid du Colombier 		return -1;
263e12c5d1SDavid du Colombier 	return 1;
273e12c5d1SDavid du Colombier }
283e12c5d1SDavid du Colombier 
293e12c5d1SDavid du Colombier proj
harrison(double r,double alpha)30219b2ee8SDavid du Colombier harrison(double r, double alpha)
313e12c5d1SDavid du Colombier {
323e12c5d1SDavid du Colombier 	u2 = cos(alpha*RAD);
333e12c5d1SDavid du Colombier 	u3 = sin(alpha*RAD);
343e12c5d1SDavid du Colombier 	v3 = r;
353e12c5d1SDavid du Colombier 	b = r*u2;
363e12c5d1SDavid du Colombier 	a = 1 + b;
373e12c5d1SDavid du Colombier 	if(r<1.001 || a<sqrt(r*r-1))
383e12c5d1SDavid du Colombier 		return 0;
393e12c5d1SDavid du Colombier 	return Xharrison;
403e12c5d1SDavid du Colombier }
41