var FORTPI = Math.PI/4; 
 | 
var srat = require('../common/srat'); 
 | 
var HALF_PI = Math.PI/2; 
 | 
var MAX_ITER = 20; 
 | 
exports.init = function() { 
 | 
  var sphi = Math.sin(this.lat0); 
 | 
  var cphi = Math.cos(this.lat0); 
 | 
  cphi *= cphi; 
 | 
  this.rc = Math.sqrt(1 - this.es) / (1 - this.es * sphi * sphi); 
 | 
  this.C = Math.sqrt(1 + this.es * cphi * cphi / (1 - this.es)); 
 | 
  this.phic0 = Math.asin(sphi / this.C); 
 | 
  this.ratexp = 0.5 * this.C * this.e; 
 | 
  this.K = Math.tan(0.5 * this.phic0 + FORTPI) / (Math.pow(Math.tan(0.5 * this.lat0 + FORTPI), this.C) * srat(this.e * sphi, this.ratexp)); 
 | 
}; 
 | 
  
 | 
exports.forward = function(p) { 
 | 
  var lon = p.x; 
 | 
  var lat = p.y; 
 | 
  
 | 
  p.y = 2 * Math.atan(this.K * Math.pow(Math.tan(0.5 * lat + FORTPI), this.C) * srat(this.e * Math.sin(lat), this.ratexp)) - HALF_PI; 
 | 
  p.x = this.C * lon; 
 | 
  return p; 
 | 
}; 
 | 
  
 | 
exports.inverse = function(p) { 
 | 
  var DEL_TOL = 1e-14; 
 | 
  var lon = p.x / this.C; 
 | 
  var lat = p.y; 
 | 
  var num = Math.pow(Math.tan(0.5 * lat + FORTPI) / this.K, 1 / this.C); 
 | 
  for (var i = MAX_ITER; i > 0; --i) { 
 | 
    lat = 2 * Math.atan(num * srat(this.e * Math.sin(p.y), - 0.5 * this.e)) - HALF_PI; 
 | 
    if (Math.abs(lat - p.y) < DEL_TOL) { 
 | 
      break; 
 | 
    } 
 | 
    p.y = lat; 
 | 
  } 
 | 
  /* convergence failed */ 
 | 
  if (!i) { 
 | 
    return null; 
 | 
  } 
 | 
  p.x = lon; 
 | 
  p.y = lat; 
 | 
  return p; 
 | 
}; 
 | 
exports.names = ["gauss"]; 
 |