/Proj4/pj_deriv.c

http://github.com/route-me/route-me · C · 36 lines · 34 code · 1 blank · 1 comment · 10 complexity · f621de6882d1b00b0f3928c4e4f7e71e MD5 · raw file

  1. /* dervative of (*P->fwd) projection */
  2. #ifndef lint
  3. static const char SCCSID[]="@(#)pj_deriv.c 4.4 93/06/12 GIE REL";
  4. #endif
  5. #define PJ_LIB__
  6. #include "projects.h"
  7. int
  8. pj_deriv(LP lp, double h, PJ *P, struct DERIVS *der) {
  9. XY t;
  10. lp.lam += h;
  11. lp.phi += h;
  12. if (fabs(lp.phi) > HALFPI) return 1;
  13. h += h;
  14. t = (*P->fwd)(lp, P);
  15. if (t.x == HUGE_VAL) return 1;
  16. der->x_l = t.x; der->y_p = t.y; der->x_p = -t.x; der->y_l = -t.y;
  17. lp.phi -= h;
  18. if (fabs(lp.phi) > HALFPI) return 1;
  19. t = (*P->fwd)(lp, P);
  20. if (t.x == HUGE_VAL) return 1;
  21. der->x_l += t.x; der->y_p -= t.y; der->x_p += t.x; der->y_l -= t.y;
  22. lp.lam -= h;
  23. t = (*P->fwd)(lp, P);
  24. if (t.x == HUGE_VAL) return 1;
  25. der->x_l -= t.x; der->y_p -= t.y; der->x_p += t.x; der->y_l += t.y;
  26. lp.phi += h;
  27. t = (*P->fwd)(lp, P);
  28. if (t.x == HUGE_VAL) return 1;
  29. der->x_l -= t.x; der->y_p += t.y; der->x_p -= t.x; der->y_l += t.y;
  30. der->x_l /= (h += h);
  31. der->y_p /= h;
  32. der->x_p /= h;
  33. der->y_l /= h;
  34. return 0;
  35. }