// FORWARD(e_forward) ellipsoid // Project coordinates from geographic (lon, lat) to cartesian (x, y) inline void fwd(geographic_type& lp_lon, geographic_type& lp_lat, cartesian_type& xy_x, cartesian_type& xy_y) const { CalculationType S, r, dr; S = pj_mlfn(lp_lat, sin(lp_lat), cos(lp_lat), this->m_proj_parm.en) - this->m_proj_parm.M0; dr = fS(S, this->m_proj_parm.C); r = this->m_proj_parm.r0 - dr; xy_x = this->m_par.k0 * (r * sin( lp_lon *= this->m_proj_parm.l ) ); xy_y = this->m_par.k0 * (this->m_proj_parm.r0 - r * cos(lp_lon) ); }
static PJ_XY lcca_e_forward (PJ_LP lp, PJ *P) { /* Ellipsoidal, forward */ PJ_XY xy = {0.0,0.0}; struct pj_opaque *Q = static_cast<struct pj_opaque*>(P->opaque); double S, r, dr; S = pj_mlfn(lp.phi, sin(lp.phi), cos(lp.phi), Q->en) - Q->M0; dr = fS(S, Q->C); r = Q->r0 - dr; xy.x = P->k0 * (r * sin( lp.lam *= Q->l ) ); xy.y = P->k0 * (Q->r0 - r * cos(lp.lam) ); return xy; }
inline void inv(cartesian_type& xy_x, cartesian_type& xy_y, geographic_type& lp_lon, geographic_type& lp_lat) const { double theta, dr, S, dif; int i; xy_x /= this->m_par.k0; xy_y /= this->m_par.k0; theta = atan2(xy_x , this->m_proj_parm.r0 - xy_y); dr = xy_y - xy_x * tan(0.5 * theta); lp_lon = theta / this->m_proj_parm.l; S = dr; for (i = MAX_ITER; i ; --i) { S -= (dif = (fS(S, this->m_proj_parm.C) - dr) / fSp(S, this->m_proj_parm.C)); if (fabs(dif) < DEL_TOL) break; } if (!i) throw proj_exception(); lp_lat = pj_inv_mlfn(S + this->m_proj_parm.M0, this->m_par.es, this->m_proj_parm.en); }
static PJ_LP lcca_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inverse */ PJ_LP lp = {0.0,0.0}; struct pj_opaque *Q = static_cast<struct pj_opaque*>(P->opaque); double theta, dr, S, dif; int i; xy.x /= P->k0; xy.y /= P->k0; theta = atan2(xy.x , Q->r0 - xy.y); dr = xy.y - xy.x * tan(0.5 * theta); lp.lam = theta / Q->l; S = dr; for (i = MAX_ITER; i ; --i) { S -= (dif = (fS(S, Q->C) - dr) / fSp(S, Q->C)); if (fabs(dif) < DEL_TOL) break; } if (!i) { proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); return lp; } lp.phi = pj_inv_mlfn(P->ctx, S + Q->M0, P->es, Q->en); return lp; }
PROJ_HEAD(lcca, "Lambert Conformal Conic Alternative") "\n\tConic, Sph&Ell\n\tlat_0="; static double /* func to compute dr */ fS(double S, double C) { return(S * ( 1. + S * S * C)); } static double /* deriv of fs */ fSp(double S, double C) { return(1. + 3.* S * S * C); } FORWARD(e_forward); /* ellipsoid */ double S, r, dr; S = pj_mlfn(lp.phi, sin(lp.phi), cos(lp.phi), P->en) - P->M0; dr = fS(S, P->C); r = P->r0 - dr; xy.x = P->k0 * (r * sin( lp.lam *= P->l ) ); xy.y = P->k0 * (P->r0 - r * cos(lp.lam) ); return (xy); } INVERSE(e_inverse); /* ellipsoid & spheroid */ double theta, dr, S, dif; int i; xy.x /= P->k0; xy.y /= P->k0; theta = atan2(xy.x , P->r0 - xy.y); dr = xy.y - xy.x * tan(0.5 * theta); lp.lam = theta / P->l; S = dr;