xref: /plan9/sys/src/cmd/map/libmap/harrison.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #include "map.h"
23e12c5d1SDavid du Colombier 
3*219b2ee8SDavid du Colombier static double v3,u2,u3,a,b; /*v=view,p=obj,u=unit.y*/
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier static int
6*219b2ee8SDavid du Colombier Xharrison(struct place *place, double *x, double *y)
73e12c5d1SDavid du Colombier {
8*219b2ee8SDavid du Colombier 	double p1 = -place->nlat.c*place->wlon.s;
9*219b2ee8SDavid du Colombier 	double p2 = -place->nlat.c*place->wlon.c;
10*219b2ee8SDavid du Colombier 	double p3 = place->nlat.s;
11*219b2ee8SDavid du Colombier 	double d = b + u3*p2 - u2*p3;
12*219b2ee8SDavid du Colombier 	double t;
133e12c5d1SDavid du Colombier 	if(d < .01)
14*219b2ee8SDavid du Colombier 		return -1;
153e12c5d1SDavid du Colombier 	t = a/d;
163e12c5d1SDavid du Colombier 	if(v3*place->nlat.s < 1.)
173e12c5d1SDavid du Colombier 		return -1;
183e12c5d1SDavid du Colombier 	*y = t*p2*u2 + (v3-t*(v3-p3))*u3;
193e12c5d1SDavid du Colombier 	*x = t*p1;
20*219b2ee8SDavid du Colombier 	if(t < 0)
213e12c5d1SDavid du Colombier 		return 0;
22*219b2ee8SDavid du Colombier 	if(*x * *x + *y * *y > 16)
23*219b2ee8SDavid du Colombier 		return -1;
243e12c5d1SDavid du Colombier 	return 1;
253e12c5d1SDavid du Colombier }
263e12c5d1SDavid du Colombier 
273e12c5d1SDavid du Colombier proj
28*219b2ee8SDavid du Colombier harrison(double r, double alpha)
293e12c5d1SDavid du Colombier {
303e12c5d1SDavid du Colombier 	u2 = cos(alpha*RAD);
313e12c5d1SDavid du Colombier 	u3 = sin(alpha*RAD);
323e12c5d1SDavid du Colombier 	v3 = r;
333e12c5d1SDavid du Colombier 	b = r*u2;
343e12c5d1SDavid du Colombier 	a = 1 + b;
353e12c5d1SDavid du Colombier 	if(r<1.001 || a<sqrt(r*r-1))
363e12c5d1SDavid du Colombier 		return 0;
373e12c5d1SDavid du Colombier 	return Xharrison;
383e12c5d1SDavid du Colombier }
39