public Point2D.Double project(double lplam, double lpphi, Point2D.Double out) {
    double t = lpphi * lpphi;

    out.y = lpphi * (1. + t * C12);
    out.x = lplam * (1. - Cp * t);
    t = lplam * lplam;
    out.x *= (0.87 - Cl * t * t);
    return out;
  }
  public Point2D.Double project(double lplam, double lpphi, Point2D.Double out) {
    double rho;

    switch (type) {
      case MURD2:
        rho = rho_c + Math.tan(sig - lpphi);
        break;
      case PCONIC:
        rho = c2 * (c1 - Math.tan(lpphi));
        break;
      default:
        rho = rho_c - lpphi;
        break;
    }
    out.x = rho * Math.sin(lplam *= n);
    out.y = rho_0 - rho * Math.cos(lplam);
    return out;
  }
  public Point2D.Double projectInverse(double xyx, double xyy, Point2D.Double out) {
    double rho;

    rho = MapMath.distance(xyx, out.y = rho_0 - xyy);
    if (n < 0.) {
      rho = -rho;
      out.x = -xyx;
      out.y = -xyy;
    }
    out.x = Math.atan2(xyx, xyy) / n;
    switch (type) {
      case PCONIC:
        out.y = Math.atan(c1 - rho / c2) + sig;
        break;
      case MURD2:
        out.y = sig - Math.atan(rho - rho_c);
        break;
      default:
        out.y = rho_c - rho;
    }
    return out;
  }
 public Point2D.Double projectInverse(double xyx, double xyy, Point2D.Double out) {
   out.y = 3. * Math.asin(xyy * RYM);
   out.x = xyx * RXM / (2. * Math.cos((out.y + out.y) * THIRD) - 1);
   return out;
 }
 public Point2D.Double project(double lplam, double lpphi, Point2D.Double out) {
   lpphi *= THIRD;
   out.x = XM * lplam * (2. * Math.cos(lpphi + lpphi) - 1.);
   out.y = YM * Math.sin(lpphi);
   return out;
 }
 public Point2D.Double projectInverse(double xyx, double xyy, Point2D.Double out) {
   out.x = RXF * xyx / (1. + Math.cos(out.y = RYF * xyy));
   return out;
 }
 public Point2D.Double project(double lplam, double lpphi, Point2D.Double out) {
   out.x = XF * (1. + Math.cos(lpphi)) * lplam;
   out.y = YF * lpphi;
   return out;
 }
 public Point2D.Double project(double lplam, double lpphi, Point2D.Double out) {
   out.x = 0.5 * lplam * (1. + Math.sqrt(Math.cos(lpphi)));
   out.y = lpphi / (Math.cos(0.5 * lpphi) * Math.cos(SIXTH * lplam));
   return out;
 }