danseijiRaw = {
function forward(l, p) {
const X = 0,
Y = 1;
let i = Math.floor(((Math.PI / 2 - p) / Math.PI) * A);
i = Math.max(0, Math.min(A - 1, i));
let j = Math.floor(((l + Math.PI) / (2 * Math.PI)) * B);
j = Math.max(0, Math.min(B - 1, j));
const [shape, ...v] = cells[i * B + j];
if (!vertices) return [NaN, NaN];
const vP = v.map(d => vertices[d]);
const pN = Math.PI / 2 - (i * Math.PI) / A;
const pS = Math.PI / 2 - ((i + 1) * Math.PI) / A;
const yS = i + 1 - ((Math.PI / 2 - p) / Math.PI) * A;
let xS = ((l + Math.PI) / (2 * Math.PI)) * B - (j + .5);
xS *= yS * Math.cos(pN) + (1 - yS) * Math.cos(pS);
const vSnw = [-.5 * Math.cos(pN), 1],
vSne = [.5 * Math.cos(pN), 1];
const vSsw = [-.5 * Math.cos(pS), 0],
vSse = [.5 * Math.cos(pS), 0];
let triS;
let triP;
if (shape < 0) {
triS = [[vSne, vSnw, vSse], [vSsw, vSse, vSnw]];
triP = [[vP[0], vP[1], vP[5]], [vP[3], vP[4], vP[2]]];
} else if (shape > 0) {
triS = [[vSse, vSne, vSsw], [vSnw, vSsw, vSne]];
triP = [[vP[5], vP[0], vP[4]], [vP[2], vP[3], vP[1]]];
} else if (i < A / 2) {
triS = [[vSnw, vSsw, vSse]];
triP = [[vP[1], vP[2], vP[3]]];
} else {
triS = [[vSsw, vSne, vSnw]];
triP = [[vP[2], vP[0], vP[1]]];
}
for (let k = 0; k < triS.length; k++) {
const tS = triS[k],
tP = triP[k];
const detT =
(tS[1][Y] - tS[2][Y]) * (tS[2][X] - tS[0][X]) +
(tS[2][X] - tS[1][X]) * (tS[2][Y] - tS[0][Y]);
const c0 =
((tS[1][Y] - tS[2][Y]) * (tS[2][X] - xS) +
(tS[2][X] - tS[1][X]) * (tS[2][Y] - yS)) /
detT;
if (c0 < 0) continue;
const c1 =
((tS[2][Y] - tS[0][Y]) * (tS[2][X] - xS) +
(tS[0][X] - tS[2][X]) * (tS[2][Y] - yS)) /
detT;
const c2 = 1 - c0 - c1;
return [
c0 * tP[0][X] + c1 * tP[1][X] + c2 * tP[2][X],
c0 * tP[0][Y] + c1 * tP[1][Y] + c2 * tP[2][Y]
];
}
return [NaN, NaN];
}
forward.invert = invert;
return forward;
}