1 |
|
2 | import {abs, asin, atan2, cos, epsilon, halfPi, pow, sign, sin} from "./math.js";
|
3 |
|
4 | export function lagrangeRaw(n) {
|
5 |
|
6 | function forward(lambda, phi) {
|
7 | if (abs(abs(phi) - halfPi) < epsilon) return [0, phi < 0 ? -2 : 2];
|
8 | var sinPhi = sin(phi),
|
9 | v = pow((1 + sinPhi) / (1 - sinPhi), n / 2),
|
10 | c = 0.5 * (v + 1 / v) + cos(lambda *= n);
|
11 | return [
|
12 | 2 * sin(lambda) / c,
|
13 | (v - 1 / v) / c
|
14 | ];
|
15 | }
|
16 |
|
17 | forward.invert = function(x, y) {
|
18 | var y0 = abs(y);
|
19 | if (abs(y0 - 2) < epsilon) return x ? null : [0, sign(y) * halfPi];
|
20 | if (y0 > 2) return null;
|
21 |
|
22 | x /= 2, y /= 2;
|
23 | var x2 = x * x,
|
24 | y2 = y * y,
|
25 | t = 2 * y / (1 + x2 + y2);
|
26 | t = pow((1 + t) / (1 - t), 1 / n);
|
27 | return [
|
28 | atan2(2 * x, 1 - x2 - y2) / n,
|
29 | asin((t - 1) / (t + 1))
|
30 | ];
|
31 | };
|
32 |
|
33 | return forward;
|
34 | }
|