/Proj4/nad_intr.c

http://github.com/route-me/route-me · C · 65 lines · 63 code · 1 blank · 1 comment · 18 complexity · 612a4dae9ba79d99761175d3a9ec1337 MD5 · raw file

  1. /* Determine nad table correction value */
  2. #ifndef lint
  3. static const char SCCSID[]="@(#)nad_intr.c 4.2 95/09/23 GIE REL";
  4. #endif
  5. #define PJ_LIB__
  6. #include "projects.h"
  7. LP
  8. nad_intr(LP t, struct CTABLE *ct) {
  9. LP val, frct;
  10. ILP indx;
  11. double m00, m10, m01, m11;
  12. FLP *f00, *f10, *f01, *f11;
  13. long index;
  14. int in;
  15. indx.lam = floor(t.lam /= ct->del.lam);
  16. indx.phi = floor(t.phi /= ct->del.phi);
  17. frct.lam = t.lam - indx.lam;
  18. frct.phi = t.phi - indx.phi;
  19. val.lam = val.phi = HUGE_VAL;
  20. if (indx.lam < 0) {
  21. if (indx.lam == -1 && frct.lam > 0.99999999999) {
  22. ++indx.lam;
  23. frct.lam = 0.;
  24. } else
  25. return val;
  26. } else if ((in = indx.lam + 1) >= ct->lim.lam) {
  27. if (in == ct->lim.lam && frct.lam < 1e-11) {
  28. --indx.lam;
  29. frct.lam = 1.;
  30. } else
  31. return val;
  32. }
  33. if (indx.phi < 0) {
  34. if (indx.phi == -1 && frct.phi > 0.99999999999) {
  35. ++indx.phi;
  36. frct.phi = 0.;
  37. } else
  38. return val;
  39. } else if ((in = indx.phi + 1) >= ct->lim.phi) {
  40. if (in == ct->lim.phi && frct.phi < 1e-11) {
  41. --indx.phi;
  42. frct.phi = 1.;
  43. } else
  44. return val;
  45. }
  46. index = indx.phi * ct->lim.lam + indx.lam;
  47. f00 = ct->cvs + index++;
  48. f10 = ct->cvs + index;
  49. index += ct->lim.lam;
  50. f11 = ct->cvs + index--;
  51. f01 = ct->cvs + index;
  52. m11 = m10 = frct.lam;
  53. m00 = m01 = 1. - frct.lam;
  54. m11 *= frct.phi;
  55. m01 *= frct.phi;
  56. frct.phi = 1. - frct.phi;
  57. m00 *= frct.phi;
  58. m10 *= frct.phi;
  59. val.lam = m00 * f00->lam + m10 * f10->lam +
  60. m01 * f01->lam + m11 * f11->lam;
  61. val.phi = m00 * f00->phi + m10 * f10->phi +
  62. m01 * f01->phi + m11 * f11->phi;
  63. return val;
  64. }