URI:
       tperspective.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tperspective.c (1445B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include "map.h"
            4 
            5 #define ORTHRAD 1000
            6 static double viewpt;
            7 
            8 static int
            9 Xperspective(struct place *place, double *x, double *y)
           10 {
           11         double r;
           12         if(viewpt<=1+FUZZ && fabs(place->nlat.s)<=viewpt+.01)
           13                 return(-1);
           14         r = place->nlat.c*(viewpt - 1.)/(viewpt - place->nlat.s);
           15         *x = - r*place->wlon.s;
           16         *y = - r*place->wlon.c;
           17         if(r>4.)
           18                 return(-1);
           19         if(fabs(viewpt)>1 && place->nlat.s<1/viewpt ||
           20            fabs(viewpt)<=1 && place->nlat.s<viewpt)
           21                         return 0;
           22         return(1);
           23 }
           24 
           25 proj
           26 perspective(double radius)
           27 {
           28         viewpt = radius;
           29         if(viewpt >= ORTHRAD)
           30                 return(Xorthographic);
           31         if(fabs(viewpt-1.)<.0001)
           32                 return(0);
           33         return(Xperspective);
           34 }
           35 
           36         /* called from various conformal projections,
           37            but not from stereographic itself */
           38 int
           39 Xstereographic(struct place *place, double *x, double *y)
           40 {
           41         double v = viewpt;
           42         int retval;
           43         viewpt = -1;
           44         retval = Xperspective(place, x, y);
           45         viewpt = v;
           46         return retval;
           47 }
           48 
           49 proj
           50 stereographic(void)
           51 {
           52         viewpt = -1.;
           53         return(Xperspective);
           54 }
           55 
           56 proj
           57 gnomonic(void)
           58 {
           59         viewpt = 0.;
           60         return(Xperspective);
           61 }
           62 
           63 int
           64 plimb(double *lat, double *lon, double res)
           65 {
           66         static int first = 1;
           67         if(viewpt >= ORTHRAD)
           68                 return olimb(lat, lon, res);
           69         if(first) {
           70                 first = 0;
           71                 *lon = -180;
           72                 if(fabs(viewpt) < .01)
           73                         *lat = 0;
           74                 else if(fabs(viewpt)<=1)
           75                         *lat = asin(viewpt)/RAD;
           76                 else
           77                         *lat = asin(1/viewpt)/RAD;
           78         } else
           79                 *lon += res;
           80         if(*lon <= 180)
           81                 return 1;
           82         first = 1;
           83         return -1;
           84 }