|
- import {geoProjectionMutator as projectionMutator} from "d3-geo";
- import {abs, acos, asin, atan2, cos, epsilon2, halfPi, pi, sin, sqrt} from "./math.js";
-
- export function hillRaw(K) {
- var L = 1 + K,
- sinBt = sin(1 / L),
- Bt = asin(sinBt),
- A = 2 * sqrt(pi / (B = pi + 4 * Bt * L)),
- B,
- rho0 = 0.5 * A * (L + sqrt(K * (2 + K))),
- K2 = K * K,
- L2 = L * L;
-
- function forward(lambda, phi) {
- var t = 1 - sin(phi),
- rho,
- omega;
- if (t && t < 2) {
- var theta = halfPi - phi, i = 25, delta;
- do {
- var sinTheta = sin(theta),
- cosTheta = cos(theta),
- Bt_Bt1 = Bt + atan2(sinTheta, L - cosTheta),
- C = 1 + L2 - 2 * L * cosTheta;
- theta -= delta = (theta - K2 * Bt - L * sinTheta + C * Bt_Bt1 -0.5 * t * B) / (2 * L * sinTheta * Bt_Bt1);
- } while (abs(delta) > epsilon2 && --i > 0);
- rho = A * sqrt(C);
- omega = lambda * Bt_Bt1 / pi;
- } else {
- rho = A * (K + t);
- omega = lambda * Bt / pi;
- }
- return [
- rho * sin(omega),
- rho0 - rho * cos(omega)
- ];
- }
-
- forward.invert = function(x, y) {
- var rho2 = x * x + (y -= rho0) * y,
- cosTheta = (1 + L2 - rho2 / (A * A)) / (2 * L),
- theta = acos(cosTheta),
- sinTheta = sin(theta),
- Bt_Bt1 = Bt + atan2(sinTheta, L - cosTheta);
- return [
- asin(x / sqrt(rho2)) * pi / Bt_Bt1,
- asin(1 - 2 * (theta - K2 * Bt - L * sinTheta + (1 + L2 - 2 * L * cosTheta) * Bt_Bt1) / B)
- ];
- };
-
- return forward;
- }
-
- export default function() {
- var K = 1,
- m = projectionMutator(hillRaw),
- p = m(K);
-
- p.ratio = function(_) {
- return arguments.length ? m(K = +_) : K;
- };
-
- return p
- .scale(167.774)
- .center([0, 18.67]);
- }
|