You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.7 KiB
66 lines
1.7 KiB
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]);
|
|
}
|
|
|