perspective.c 1.4 KB

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