import “../math/trigonometry”; import “geo”;

d3.geo.interpolate = function(source, target) {

return d3_geo_interpolate(
  source[0] * d3_radians, source[1] * d3_radians,
  target[0] * d3_radians, target[1] * d3_radians
);

};

function d3_geo_interpolate(x0, y0, x1, y1) {

var cy0 = Math.cos(y0),
    sy0 = Math.sin(y0),
    cy1 = Math.cos(y1),
    sy1 = Math.sin(y1),
    kx0 = cy0 * Math.cos(x0),
    ky0 = cy0 * Math.sin(x0),
    kx1 = cy1 * Math.cos(x1),
    ky1 = cy1 * Math.sin(x1),
    d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))),
    k = 1 / Math.sin(d);

var interpolate = d ? function(t) {
  var B = Math.sin(t *= d) * k,
      A = Math.sin(d - t) * k,
      x = A * kx0 + B * kx1,
      y = A * ky0 + B * ky1,
      z = A * sy0 + B * sy1;
  return [
    Math.atan2(y, x) * d3_degrees,
    Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees
  ];
} : function() { return [x0 * d3_degrees, y0 * d3_degrees]; };

interpolate.distance = d;

return interpolate;

};