{"version":3,"file":"buildArcToSvg.mjs","sources":["../../../../../src/scene/graphics/shared/buildCommands/buildArcToSvg.ts"],"sourcesContent":["import { buildAdaptiveBezier } from './buildAdaptiveBezier';\n\nconst TAU = Math.PI * 2;\n\nconst out = {\n    centerX: 0,\n    centerY: 0,\n    ang1: 0,\n    ang2: 0\n};\n\nconst mapToEllipse = (\n    { x, y }: {x: number, y: number},\n    rx: number, ry: number,\n    cosPhi: number, sinPhi: number,\n    centerX: number, centerY: number,\n    out: {x: number, y: number}\n): {x: number, y: number} =>\n{\n    x *= rx;\n    y *= ry;\n\n    const xp = (cosPhi * x) - (sinPhi * y);\n    const yp = (sinPhi * x) + (cosPhi * y);\n\n    out.x = xp + centerX;\n    out.y = yp + centerY;\n\n    return out;\n};\n\nfunction approxUnitArc(ang1: number, ang2: number): {x: number, y: number}[]\n{\n    // If 90 degree circular arc, use a constant\n    // as derived from http://spencermortensen.com/articles/bezier-circle\n\n    const a1 = ang2 === -1.5707963267948966 ? -0.551915024494 : 4 / 3 * Math.tan(ang2 / 4);\n\n    const a = ang2 === 1.5707963267948966 ? 0.551915024494 : a1;\n\n    const x1 = Math.cos(ang1);\n    const y1 = Math.sin(ang1);\n    const x2 = Math.cos(ang1 + ang2);\n    const y2 = Math.sin(ang1 + ang2);\n\n    return [\n        {\n            x: x1 - (y1 * a),\n            y: y1 + (x1 * a)\n        },\n        {\n            x: x2 + (y2 * a),\n            y: y2 - (x2 * a)\n        },\n        {\n            x: x2,\n            y: y2\n        }\n    ];\n}\n\nconst vectorAngle = (ux: number, uy: number, vx: number, vy: number) =>\n{\n    const sign = ((ux * vy) - (uy * vx) < 0) ? -1 : 1;\n\n    let dot = (ux * vx) + (uy * vy);\n\n    if (dot > 1)\n    {\n        dot = 1;\n    }\n\n    if (dot < -1)\n    {\n        dot = -1;\n    }\n\n    return sign * Math.acos(dot);\n};\n\nconst getArcCenter = (\n    px: number,\n    py: number,\n    cx: number,\n    cy: number,\n    rx: number,\n    ry: number,\n    largeArcFlag: number,\n    sweepFlag: number,\n    sinPhi: number,\n    cosPhi: number,\n    pxp: number,\n    pyp: number,\n    out: {\n        centerX: number,\n        centerY: number,\n        ang1: number,\n        ang2: number\n    }\n// eslint-disable-next-line max-params\n) =>\n{\n    const rxSq = Math.pow(rx, 2);\n    const rySq = Math.pow(ry, 2);\n    const pxpSq = Math.pow(pxp, 2);\n    const pypSq = Math.pow(pyp, 2);\n\n    let radicant = (rxSq * rySq) - (rxSq * pypSq) - (rySq * pxpSq);\n\n    if (radicant < 0)\n    {\n        radicant = 0;\n    }\n\n    radicant /= (rxSq * pypSq) + (rySq * pxpSq);\n    radicant = Math.sqrt(radicant) * (largeArcFlag === sweepFlag ? -1 : 1);\n\n    const centerXp = radicant * rx / ry * pyp;\n    const centerYp = radicant * -ry / rx * pxp;\n\n    const centerX = (cosPhi * centerXp) - (sinPhi * centerYp) + ((px + cx) / 2);\n    const centerY = (sinPhi * centerXp) + (cosPhi * centerYp) + ((py + cy) / 2);\n\n    const vx1 = (pxp - centerXp) / rx;\n    const vy1 = (pyp - centerYp) / ry;\n    const vx2 = (-pxp - centerXp) / rx;\n    const vy2 = (-pyp - centerYp) / ry;\n\n    const ang1 = vectorAngle(1, 0, vx1, vy1);\n    let ang2 = vectorAngle(vx1, vy1, vx2, vy2);\n\n    if (sweepFlag === 0 && ang2 > 0)\n    {\n        ang2 -= TAU;\n    }\n\n    if (sweepFlag === 1 && ang2 < 0)\n    {\n        ang2 += TAU;\n    }\n\n    out.centerX = centerX;\n    out.centerY = centerY;\n    out.ang1 = ang1;\n    out.ang2 = ang2;\n};\n\nexport function buildArcToSvg(\n    points: number[],\n    px: number,\n    py: number,\n    cx: number,\n    cy: number,\n    rx: number,\n    ry: number,\n    xAxisRotation = 0,\n    largeArcFlag = 0,\n    sweepFlag = 0\n): void\n{\n    if (rx === 0 || ry === 0)\n    {\n        return;\n    }\n\n    const sinPhi = Math.sin(xAxisRotation * TAU / 360);\n    const cosPhi = Math.cos(xAxisRotation * TAU / 360);\n\n    const pxp = (cosPhi * (px - cx) / 2) + (sinPhi * (py - cy) / 2);\n    const pyp = (-sinPhi * (px - cx) / 2) + (cosPhi * (py - cy) / 2);\n\n    if (pxp === 0 && pyp === 0)\n    {\n        return;\n    }\n\n    rx = Math.abs(rx);\n    ry = Math.abs(ry);\n\n    const lambda = (Math.pow(pxp, 2) / Math.pow(rx, 2)) + (Math.pow(pyp, 2) / Math.pow(ry, 2));\n\n    if (lambda > 1)\n    {\n        rx *= Math.sqrt(lambda);\n        ry *= Math.sqrt(lambda);\n    }\n\n    getArcCenter(\n        px,\n        py,\n        cx,\n        cy,\n        rx,\n        ry,\n        largeArcFlag,\n        sweepFlag,\n        sinPhi,\n        cosPhi,\n        pxp,\n        pyp,\n        out\n    );\n\n    let { ang1, ang2 } = out;\n    const { centerX, centerY } = out;\n\n    // If 'ang2' == 90.0000000001, then `ratio` will devalue to\n    // 1.0000000001. This causes `segments` to be greater than one, which is an\n    // unnecessary split, and adds extra points to the bezier curve. To alleviate\n    // this issue, we round to 1.0 when the ratio is close to 1.0.\n    let ratio = Math.abs(ang2) / (TAU / 4);\n\n    if (Math.abs(1.0 - ratio) < 0.0000001)\n    {\n        ratio = 1.0;\n    }\n\n    const segments = Math.max(Math.ceil(ratio), 1);\n\n    ang2 /= segments;\n\n    let lastX = points[points.length - 2];\n    let lastY = points[points.length - 1];\n\n    const outCurvePoint = { x: 0, y: 0 };\n\n    for (let i = 0; i < segments; i++)\n    {\n        const curve = approxUnitArc(ang1, ang2);\n\n        const { x: x1, y: y1 } = mapToEllipse(curve[0], rx, ry, cosPhi, sinPhi, centerX, centerY, outCurvePoint);\n        const { x: x2, y: y2 } = mapToEllipse(curve[1], rx, ry, cosPhi, sinPhi, centerX, centerY, outCurvePoint);\n        const { x, y } = mapToEllipse(curve[2], rx, ry, cosPhi, sinPhi, centerX, centerY, outCurvePoint);\n\n        buildAdaptiveBezier(\n            points,\n            lastX, lastY,\n            x1, y1, x2, y2, x, y\n        );\n\n        lastX = x;\n        lastY = y;\n\n        ang1 += ang2;\n    }\n}\n"],"names":["out"],"mappings":"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"}