import {abs, atan, atan2, cos, epsilon, halfPi, log, pi, pow, sign, sin, sqrt, tan} from "../math.js"; import {conicProjection} from "./conic.js"; import {mercatorRaw} from "./mercator.js"; function tany(y) { return tan((halfPi + y) / 2); } export function conicConformalRaw(y0, y1) { var cy0 = cos(y0), n = y0 === y1 ? sin(y0) : log(cy0 / cos(y1)) / log(tany(y1) / tany(y0)), f = cy0 * pow(tany(y0), n) / n; if (!n) return mercatorRaw; function project(x, y) { if (f > 0) { if (y < -halfPi + epsilon) y = -halfPi + epsilon; } else { if (y > halfPi - epsilon) y = halfPi - epsilon; } var r = f / pow(tany(y), n); return [r * sin(n * x), f - r * cos(n * x)]; } project.invert = function(x, y) { var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy), l = atan2(x, abs(fy)) * sign(fy); if (fy * n < 0) l -= pi * sign(x) * sign(fy); return [l / n, 2 * atan(pow(f / r, 1 / n)) - halfPi]; }; return project; } export default function() { return conicProjection(conicConformalRaw) .scale(109.5) .parallels([30, 30]); }