48 lines
1.1 KiB
JavaScript
48 lines
1.1 KiB
JavaScript
![]() |
import {geoProjectionMutator as projectionMutator} from "d3-geo";
|
||
|
import {abs, asin, atan2, cos, epsilon, halfPi, pow, sign, sin} from "./math";
|
||
|
|
||
|
export function lagrangeRaw(n) {
|
||
|
|
||
|
function forward(lambda, phi) {
|
||
|
if (abs(abs(phi) - halfPi) < epsilon) return [0, phi < 0 ? -2 : 2];
|
||
|
var sinPhi = sin(phi),
|
||
|
v = pow((1 + sinPhi) / (1 - sinPhi), n / 2),
|
||
|
c = 0.5 * (v + 1 / v) + cos(lambda *= n);
|
||
|
return [
|
||
|
2 * sin(lambda) / c,
|
||
|
(v - 1 / v) / c
|
||
|
];
|
||
|
}
|
||
|
|
||
|
forward.invert = function(x, y) {
|
||
|
var y0 = abs(y);
|
||
|
if (abs(y0 - 2) < epsilon) return x ? null : [0, sign(y) * halfPi];
|
||
|
if (y0 > 2) return null;
|
||
|
|
||
|
x /= 2, y /= 2;
|
||
|
var x2 = x * x,
|
||
|
y2 = y * y,
|
||
|
t = 2 * y / (1 + x2 + y2); // tanh(nPhi)
|
||
|
t = pow((1 + t) / (1 - t), 1 / n);
|
||
|
return [
|
||
|
atan2(2 * x, 1 - x2 - y2) / n,
|
||
|
asin((t - 1) / (t + 1))
|
||
|
];
|
||
|
};
|
||
|
|
||
|
return forward;
|
||
|
}
|
||
|
|
||
|
export default function() {
|
||
|
var n = 0.5,
|
||
|
m = projectionMutator(lagrangeRaw),
|
||
|
p = m(n);
|
||
|
|
||
|
p.spacing = function(_) {
|
||
|
return arguments.length ? m(n = +_) : n;
|
||
|
};
|
||
|
|
||
|
return p
|
||
|
.scale(124.75);
|
||
|
}
|