Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

67 linhas
1.7 KiB

  1. import {geoProjectionMutator as projectionMutator} from "d3-geo";
  2. import {abs, acos, asin, atan2, cos, epsilon2, halfPi, pi, sin, sqrt} from "./math.js";
  3. export function hillRaw(K) {
  4. var L = 1 + K,
  5. sinBt = sin(1 / L),
  6. Bt = asin(sinBt),
  7. A = 2 * sqrt(pi / (B = pi + 4 * Bt * L)),
  8. B,
  9. rho0 = 0.5 * A * (L + sqrt(K * (2 + K))),
  10. K2 = K * K,
  11. L2 = L * L;
  12. function forward(lambda, phi) {
  13. var t = 1 - sin(phi),
  14. rho,
  15. omega;
  16. if (t && t < 2) {
  17. var theta = halfPi - phi, i = 25, delta;
  18. do {
  19. var sinTheta = sin(theta),
  20. cosTheta = cos(theta),
  21. Bt_Bt1 = Bt + atan2(sinTheta, L - cosTheta),
  22. C = 1 + L2 - 2 * L * cosTheta;
  23. theta -= delta = (theta - K2 * Bt - L * sinTheta + C * Bt_Bt1 -0.5 * t * B) / (2 * L * sinTheta * Bt_Bt1);
  24. } while (abs(delta) > epsilon2 && --i > 0);
  25. rho = A * sqrt(C);
  26. omega = lambda * Bt_Bt1 / pi;
  27. } else {
  28. rho = A * (K + t);
  29. omega = lambda * Bt / pi;
  30. }
  31. return [
  32. rho * sin(omega),
  33. rho0 - rho * cos(omega)
  34. ];
  35. }
  36. forward.invert = function(x, y) {
  37. var rho2 = x * x + (y -= rho0) * y,
  38. cosTheta = (1 + L2 - rho2 / (A * A)) / (2 * L),
  39. theta = acos(cosTheta),
  40. sinTheta = sin(theta),
  41. Bt_Bt1 = Bt + atan2(sinTheta, L - cosTheta);
  42. return [
  43. asin(x / sqrt(rho2)) * pi / Bt_Bt1,
  44. asin(1 - 2 * (theta - K2 * Bt - L * sinTheta + (1 + L2 - 2 * L * cosTheta) * Bt_Bt1) / B)
  45. ];
  46. };
  47. return forward;
  48. }
  49. export default function() {
  50. var K = 1,
  51. m = projectionMutator(hillRaw),
  52. p = m(K);
  53. p.ratio = function(_) {
  54. return arguments.length ? m(K = +_) : K;
  55. };
  56. return p
  57. .scale(167.774)
  58. .center([0, 18.67]);
  59. }