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.
49 lines
1.4 KiB
49 lines
1.4 KiB
import {geoProjectionMutator as projectionMutator} from "d3-geo";
|
|
import {abs, asin, atan2, cos, degrees, epsilon, halfPi, log, radians, sin, sqrt, tan} from "./math.js";
|
|
|
|
export function airyRaw(beta) {
|
|
var tanBeta_2 = tan(beta / 2),
|
|
b = 2 * log(cos(beta / 2)) / (tanBeta_2 * tanBeta_2);
|
|
|
|
function forward(x, y) {
|
|
var cosx = cos(x),
|
|
cosy = cos(y),
|
|
siny = sin(y),
|
|
cosz = cosy * cosx,
|
|
k = -((1 - cosz ? log((1 + cosz) / 2) / (1 - cosz) : -0.5) + b / (1 + cosz));
|
|
return [k * cosy * sin(x), k * siny];
|
|
}
|
|
|
|
forward.invert = function(x, y) {
|
|
var r = sqrt(x * x + y * y),
|
|
z = -beta / 2,
|
|
i = 50, delta;
|
|
if (!r) return [0, 0];
|
|
do {
|
|
var z_2 = z / 2,
|
|
cosz_2 = cos(z_2),
|
|
sinz_2 = sin(z_2),
|
|
tanz_2 = sinz_2 / cosz_2,
|
|
lnsecz_2 = -log(abs(cosz_2));
|
|
z -= delta = (2 / tanz_2 * lnsecz_2 - b * tanz_2 - r) / (-lnsecz_2 / (sinz_2 * sinz_2) + 1 - b / (2 * cosz_2 * cosz_2)) * (cosz_2 < 0 ? 0.7 : 1);
|
|
} while (abs(delta) > epsilon && --i > 0);
|
|
var sinz = sin(z);
|
|
return [atan2(x * sinz, r * cos(z)), asin(y * sinz / r)];
|
|
};
|
|
|
|
return forward;
|
|
}
|
|
|
|
export default function() {
|
|
var beta = halfPi,
|
|
m = projectionMutator(airyRaw),
|
|
p = m(beta);
|
|
|
|
p.radius = function(_) {
|
|
return arguments.length ? m(beta = _ * radians) : beta * degrees;
|
|
};
|
|
|
|
return p
|
|
.scale(179.976)
|
|
.clipAngle(147);
|
|
}
|
|
|