| #include <u.h> |
| #include <libc.h> |
| #include "map.h" |
| |
| int |
| Xgilbert(struct place *p, double *x, double *y) |
| { |
| /* the interesting part - map the sphere onto a hemisphere */ |
| struct place q; |
| q.nlat.s = tan(0.5*(p->nlat.l)); |
| if(q.nlat.s > 1) q.nlat.s = 1; |
| if(q.nlat.s < -1) q.nlat.s = -1; |
| q.nlat.c = sqrt(1 - q.nlat.s*q.nlat.s); |
| q.wlon.l = p->wlon.l/2; |
| sincos(&q.wlon); |
| /* the dull part: present the hemisphere orthogrpahically */ |
| *y = q.nlat.s; |
| *x = -q.wlon.s*q.nlat.c; |
| return(1); |
| } |
| |
| proj |
| gilbert(void) |
| { |
| return(Xgilbert); |
| } |
| |
| /* derivation of the interesting part: |
| map the sphere onto the plane by stereographic projection; |
| map the plane onto a half plane by sqrt; |
| map the half plane back to the sphere by stereographic |
| projection |
| |
| n,w are original lat and lon |
| r is stereographic radius |
| primes are transformed versions |
| |
| r = cos(n)/(1+sin(n)) |
| r' = sqrt(r) = cos(n')/(1+sin(n')) |
| |
| r'^2 = (1-sin(n')^2)/(1+sin(n')^2) = cos(n)/(1+sin(n)) |
| |
| this is a linear equation for sin n', with solution |
| |
| sin n' = (1+sin(n)-cos(n))/(1+sin(n)+cos(n)) |
| |
| use standard formula: tan x/2 = (1-cos x)/sin x = sin x/(1+cos x) |
| to show that the right side of the last equation is tan(n/2) |
| */ |
| |
| |