interpolate.js 911 B

123456789101112131415161718192021222324252627282930313233343536
  1. import {asin, atan2, cos, degrees, haversin, radians, sin, sqrt} from "./math";
  2. export default function(a, b) {
  3. var x0 = a[0] * radians,
  4. y0 = a[1] * radians,
  5. x1 = b[0] * radians,
  6. y1 = b[1] * radians,
  7. cy0 = cos(y0),
  8. sy0 = sin(y0),
  9. cy1 = cos(y1),
  10. sy1 = sin(y1),
  11. kx0 = cy0 * cos(x0),
  12. ky0 = cy0 * sin(x0),
  13. kx1 = cy1 * cos(x1),
  14. ky1 = cy1 * sin(x1),
  15. d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))),
  16. k = sin(d);
  17. var interpolate = d ? function(t) {
  18. var B = sin(t *= d) / k,
  19. A = sin(d - t) / k,
  20. x = A * kx0 + B * kx1,
  21. y = A * ky0 + B * ky1,
  22. z = A * sy0 + B * sy1;
  23. return [
  24. atan2(y, x) * degrees,
  25. atan2(z, sqrt(x * x + y * y)) * degrees
  26. ];
  27. } : function() {
  28. return [x0 * degrees, y0 * degrees];
  29. };
  30. interpolate.distance = d;
  31. return interpolate;
  32. }