123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- #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)
- */
|