Sha256: 91bc9fe50a447bff0a491ead43a0fcbfd9575131c9addad44c881d3b7f16e1e5

Contents?: true

Size: 1.37 KB

Versions: 2

Compression:

Stored size: 1.37 KB

Contents

function guyou(λ, φ) {
  return guyouEllipticFi(λ, sgn(φ) * Math.log(Math.tan(.5 * (Math.abs(φ) + π / 2))), .5);
}

// Calculate F(φ+iψ|m).
// See Abramowitz and Stegun, 17.4.11.
function guyouEllipticFi(φ, ψ, m) {
  var r = Math.abs(φ),
      i = Math.abs(ψ),
      sinhψ = .5 * ((sinhψ = Math.exp(i)) - 1 / sinhψ);
  if (r) {
    var cscφ = 1 / Math.sin(r),
        cotφ2 = (cotφ2 = Math.cos(r) * cscφ) * cotφ2,
        b = -(cotφ2 + m * (sinhψ * sinhψ * cscφ * cscφ + 1) - 1),
        cotλ2 = .5 * (-b + Math.sqrt(b * b - 4 * (m - 1) * cotφ2));
    return [
      guyouEllipticF(Math.atan(1 / Math.sqrt(cotλ2)), m) * sgn(φ),
      guyouEllipticF(Math.atan(Math.sqrt(cotλ2 / cotφ2 - 1) / m), 1 - m) * sgn(ψ)
    ];
  }
  return [
    0,
    guyouEllipticF(Math.atan(sinhψ), 1 - m) * sgn(ψ)
  ];
}

// Calculate F(φ|m) where m = k² = sin²α.
// See Abramowitz and Stegun, 17.6.7.
function guyouEllipticF(φ, m) {
  var a = 1,
      b = Math.sqrt(1 - m),
      c = Math.sqrt(m);
  for (var i = 0; Math.abs(c) > ε; i++) {
    if (φ % π) {
      var dφ = Math.atan(b * Math.tan(φ) / a);
      if (dφ < 0) dφ += π;
      φ += dφ + ~~(φ / π) * π;
    } else φ += φ;
    c = (a + b) / 2;
    b = Math.sqrt(a * b);
    c = ((a = c) - b) / 2;
  }
  return φ / (Math.pow(2, i) * a);
}

(d3.geo.guyou = function() { return projection(guyou); }).raw = guyou;

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
d3js-plugins-rails-0.0.2 vendor/assets/javascripts/d3/plugins/geo/projection/guyou.js
d3js-plugins-rails-0.0.1 vendor/assets/javascripts/d3/plugins/geo/projection/guyou.js