// dervative of (P.fwd) projection public static bool pj_deriv(LP lp, double h, PJ P, out DERIVS der) { der.x_l = der.y_p = der.x_p = der.y_l = 0; XY t; lp.lam += h; lp.phi += h; if (Math.Abs(lp.phi) > Proj.HALFPI) { return(true); } h += h; t = P.fwd(lp); if (t.x == Libc.HUGE_VAL) { return(true); } der.x_l = t.x; der.y_p = t.y; der.x_p = -t.x; der.y_l = -t.y; lp.phi -= h; if (Math.Abs(lp.phi) > Proj.HALFPI) { return(true); } t = P.fwd(lp); if (t.x == Libc.HUGE_VAL) { return(true); } der.x_l += t.x; der.y_p -= t.y; der.x_p += t.x; der.y_l -= t.y; lp.lam -= h; t = P.fwd(lp); if (t.x == Libc.HUGE_VAL) { return(true); } der.x_l -= t.x; der.y_p -= t.y; der.x_p += t.x; der.y_l += t.y; lp.phi += h; t = P.fwd(lp); if (t.x == Libc.HUGE_VAL) { return(true); } der.x_l -= t.x; der.y_p += t.y; der.x_p -= t.x; der.y_l += t.y; der.x_l /= (h += h); der.y_p /= h; der.x_p /= h; der.y_l /= h; return(false); }
// spheroid XY o_forward(LP lp) { double coslam = Math.Cos(lp.lam); double sinphi = Math.Sin(lp.phi); double cosphi = Math.Cos(lp.phi); lp.lam = Proj.adjlon(Proj.aatan2(cosphi * Math.Sin(lp.lam), sphip * cosphi * coslam + cphip * sinphi) + lamp); lp.phi = Proj.aasin(ctx, sphip * sinphi - cphip * cosphi * coslam); return(link.fwd(lp)); }
// dervative of (P.fwd) projection public static bool pj_deriv(LP lp, double h, PJ P, out DERIVS der) { der.x_l=der.y_p=der.x_p=der.y_l=0; XY t; lp.lam+=h; lp.phi+=h; if(Math.Abs(lp.phi)>Proj.HALFPI) return true; h+=h; t=P.fwd(lp); if(t.x==Libc.HUGE_VAL) return true; der.x_l=t.x; der.y_p=t.y; der.x_p=-t.x; der.y_l=-t.y; lp.phi-=h; if(Math.Abs(lp.phi)>Proj.HALFPI) return true; t=P.fwd(lp); if(t.x==Libc.HUGE_VAL) return true; der.x_l+=t.x; der.y_p-=t.y; der.x_p+=t.x; der.y_l-=t.y; lp.lam-=h; t=P.fwd(lp); if(t.x==Libc.HUGE_VAL) return true; der.x_l-=t.x; der.y_p-=t.y; der.x_p+=t.x; der.y_l+=t.y; lp.phi+=h; t=P.fwd(lp); if(t.x==Libc.HUGE_VAL) return true; der.x_l-=t.x; der.y_p+=t.y; der.x_p-=t.x; der.y_l+=t.y; der.x_l/=(h+=h); der.y_p/=h; der.x_p/=h; der.y_l/=h; return false; }
// spheroid XY s_forward(LP lp) { XY xy; xy.x = xy.y = 0; if (Math.Abs(lp.phi) <= PHI_LIM) { xy = sinu.fwd(lp); } else { xy = moll.fwd(lp); xy.y -= (lp.phi >= 0.0?Y_COR:-Y_COR); } return(xy); }