1 line
12 KiB
Plaintext
1 line
12 KiB
Plaintext
{"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":";;;AAEA,MAAM,GAAA,GAAM,KAAK,EAAK,GAAA,CAAA,CAAA;AAEtB,MAAM,GAAM,GAAA;AAAA,EACR,OAAS,EAAA,CAAA;AAAA,EACT,OAAS,EAAA,CAAA;AAAA,EACT,IAAM,EAAA,CAAA;AAAA,EACN,IAAM,EAAA,CAAA;AACV,CAAA,CAAA;AAEA,MAAM,YAAe,GAAA,CACjB,EAAE,CAAA,EAAG,CAAE,EAAA,EACP,EAAY,EAAA,EAAA,EACZ,MAAgB,EAAA,MAAA,EAChB,OAAiB,EAAA,OAAA,EACjBA,IAEJ,KAAA;AACI,EAAK,CAAA,IAAA,EAAA,CAAA;AACL,EAAK,CAAA,IAAA,EAAA,CAAA;AAEL,EAAM,MAAA,EAAA,GAAM,MAAS,GAAA,CAAA,GAAM,MAAS,GAAA,CAAA,CAAA;AACpC,EAAM,MAAA,EAAA,GAAM,MAAS,GAAA,CAAA,GAAM,MAAS,GAAA,CAAA,CAAA;AAEpC,EAAAA,IAAAA,CAAI,IAAI,EAAK,GAAA,OAAA,CAAA;AACb,EAAAA,IAAAA,CAAI,IAAI,EAAK,GAAA,OAAA,CAAA;AAEb,EAAOA,OAAAA,IAAAA,CAAAA;AACX,CAAA,CAAA;AAEA,SAAS,aAAA,CAAc,MAAc,IACrC,EAAA;AAII,EAAM,MAAA,EAAA,GAAK,SAAS,CAAsB,kBAAA,GAAA,CAAA,cAAA,GAAkB,IAAI,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,IAAA,GAAO,CAAC,CAAA,CAAA;AAErF,EAAM,MAAA,CAAA,GAAI,IAAS,KAAA,kBAAA,GAAqB,cAAiB,GAAA,EAAA,CAAA;AAEzD,EAAM,MAAA,EAAA,GAAK,IAAK,CAAA,GAAA,CAAI,IAAI,CAAA,CAAA;AACxB,EAAM,MAAA,EAAA,GAAK,IAAK,CAAA,GAAA,CAAI,IAAI,CAAA,CAAA;AACxB,EAAA,MAAM,EAAK,GAAA,IAAA,CAAK,GAAI,CAAA,IAAA,GAAO,IAAI,CAAA,CAAA;AAC/B,EAAA,MAAM,EAAK,GAAA,IAAA,CAAK,GAAI,CAAA,IAAA,GAAO,IAAI,CAAA,CAAA;AAE/B,EAAO,OAAA;AAAA,IACH;AAAA,MACI,CAAA,EAAG,KAAM,EAAK,GAAA,CAAA;AAAA,MACd,CAAA,EAAG,KAAM,EAAK,GAAA,CAAA;AAAA,KAClB;AAAA,IACA;AAAA,MACI,CAAA,EAAG,KAAM,EAAK,GAAA,CAAA;AAAA,MACd,CAAA,EAAG,KAAM,EAAK,GAAA,CAAA;AAAA,KAClB;AAAA,IACA;AAAA,MACI,CAAG,EAAA,EAAA;AAAA,MACH,CAAG,EAAA,EAAA;AAAA,KACP;AAAA,GACJ,CAAA;AACJ,CAAA;AAEA,MAAM,WAAc,GAAA,CAAC,EAAY,EAAA,EAAA,EAAY,IAAY,EACzD,KAAA;AACI,EAAA,MAAM,OAAS,EAAK,GAAA,EAAA,GAAO,EAAK,GAAA,EAAA,GAAM,IAAK,CAAK,CAAA,GAAA,CAAA,CAAA;AAEhD,EAAI,IAAA,GAAA,GAAO,EAAK,GAAA,EAAA,GAAO,EAAK,GAAA,EAAA,CAAA;AAE5B,EAAA,IAAI,MAAM,CACV,EAAA;AACI,IAAM,GAAA,GAAA,CAAA,CAAA;AAAA,GACV;AAEA,EAAA,IAAI,MAAM,CACV,CAAA,EAAA;AACI,IAAM,GAAA,GAAA,CAAA,CAAA,CAAA;AAAA,GACV;AAEA,EAAO,OAAA,IAAA,GAAO,IAAK,CAAA,IAAA,CAAK,GAAG,CAAA,CAAA;AAC/B,CAAA,CAAA;AAEA,MAAM,YAAe,GAAA,CACjB,EACA,EAAA,EAAA,EACA,IACA,EACA,EAAA,EAAA,EACA,EACA,EAAA,YAAA,EACA,SACA,EAAA,MAAA,EACA,MACA,EAAA,GAAA,EACA,KACAA,IAQJ,KAAA;AACI,EAAA,MAAM,IAAO,GAAA,IAAA,CAAK,GAAI,CAAA,EAAA,EAAI,CAAC,CAAA,CAAA;AAC3B,EAAA,MAAM,IAAO,GAAA,IAAA,CAAK,GAAI,CAAA,EAAA,EAAI,CAAC,CAAA,CAAA;AAC3B,EAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,GAAI,CAAA,GAAA,EAAK,CAAC,CAAA,CAAA;AAC7B,EAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,GAAI,CAAA,GAAA,EAAK,CAAC,CAAA,CAAA;AAE7B,EAAA,IAAI,QAAY,GAAA,IAAA,GAAO,IAAS,GAAA,IAAA,GAAO,QAAU,IAAO,GAAA,KAAA,CAAA;AAExD,EAAA,IAAI,WAAW,CACf,EAAA;AACI,IAAW,QAAA,GAAA,CAAA,CAAA;AAAA,GACf;AAEA,EAAa,QAAA,IAAA,IAAA,GAAO,QAAU,IAAO,GAAA,KAAA,CAAA;AACrC,EAAA,QAAA,GAAW,KAAK,IAAK,CAAA,QAAQ,CAAK,IAAA,YAAA,KAAiB,YAAY,CAAK,CAAA,GAAA,CAAA,CAAA,CAAA;AAEpE,EAAM,MAAA,QAAA,GAAW,QAAW,GAAA,EAAA,GAAK,EAAK,GAAA,GAAA,CAAA;AACtC,EAAA,MAAM,QAAW,GAAA,QAAA,GAAW,CAAC,EAAA,GAAK,EAAK,GAAA,GAAA,CAAA;AAEvC,EAAA,MAAM,UAAW,MAAS,GAAA,QAAA,GAAa,MAAS,GAAA,QAAA,GAAA,CAAc,KAAK,EAAM,IAAA,CAAA,CAAA;AACzE,EAAA,MAAM,UAAW,MAAS,GAAA,QAAA,GAAa,MAAS,GAAA,QAAA,GAAA,CAAc,KAAK,EAAM,IAAA,CAAA,CAAA;AAEzE,EAAM,MAAA,GAAA,GAAA,CAAO,MAAM,QAAY,IAAA,EAAA,CAAA;AAC/B,EAAM,MAAA,GAAA,GAAA,CAAO,MAAM,QAAY,IAAA,EAAA,CAAA;AAC/B,EAAM,MAAA,GAAA,GAAA,CAAO,CAAC,GAAA,GAAM,QAAY,IAAA,EAAA,CAAA;AAChC,EAAM,MAAA,GAAA,GAAA,CAAO,CAAC,GAAA,GAAM,QAAY,IAAA,EAAA,CAAA;AAEhC,EAAA,MAAM,IAAO,GAAA,WAAA,CAAY,CAAG,EAAA,CAAA,EAAG,KAAK,GAAG,CAAA,CAAA;AACvC,EAAA,IAAI,IAAO,GAAA,WAAA,CAAY,GAAK,EAAA,GAAA,EAAK,KAAK,GAAG,CAAA,CAAA;AAEzC,EAAI,IAAA,SAAA,KAAc,CAAK,IAAA,IAAA,GAAO,CAC9B,EAAA;AACI,IAAQ,IAAA,IAAA,GAAA,CAAA;AAAA,GACZ;AAEA,EAAI,IAAA,SAAA,KAAc,CAAK,IAAA,IAAA,GAAO,CAC9B,EAAA;AACI,IAAQ,IAAA,IAAA,GAAA,CAAA;AAAA,GACZ;AAEA,EAAAA,KAAI,OAAU,GAAA,OAAA,CAAA;AACd,EAAAA,KAAI,OAAU,GAAA,OAAA,CAAA;AACd,EAAAA,KAAI,IAAO,GAAA,IAAA,CAAA;AACX,EAAAA,KAAI,IAAO,GAAA,IAAA,CAAA;AACf,CAAA,CAAA;AAEO,SAAS,aACZ,CAAA,MAAA,EACA,EACA,EAAA,EAAA,EACA,EACA,EAAA,EAAA,EACA,EACA,EAAA,EAAA,EACA,aAAgB,GAAA,CAAA,EAChB,YAAe,GAAA,CAAA,EACf,YAAY,CAEhB,EAAA;AACI,EAAI,IAAA,EAAA,KAAO,CAAK,IAAA,EAAA,KAAO,CACvB,EAAA;AACI,IAAA,OAAA;AAAA,GACJ;AAEA,EAAA,MAAM,MAAS,GAAA,IAAA,CAAK,GAAI,CAAA,aAAA,GAAgB,MAAM,GAAG,CAAA,CAAA;AACjD,EAAA,MAAM,MAAS,GAAA,IAAA,CAAK,GAAI,CAAA,aAAA,GAAgB,MAAM,GAAG,CAAA,CAAA;AAEjD,EAAA,MAAM,MAAO,MAAU,IAAA,EAAA,GAAK,MAAM,CAAM,GAAA,MAAA,IAAU,KAAK,EAAM,CAAA,GAAA,CAAA,CAAA;AAC7D,EAAM,MAAA,GAAA,GAAO,CAAC,MAAU,IAAA,EAAA,GAAK,MAAM,CAAM,GAAA,MAAA,IAAU,KAAK,EAAM,CAAA,GAAA,CAAA,CAAA;AAE9D,EAAI,IAAA,GAAA,KAAQ,CAAK,IAAA,GAAA,KAAQ,CACzB,EAAA;AACI,IAAA,OAAA;AAAA,GACJ;AAEA,EAAK,EAAA,GAAA,IAAA,CAAK,IAAI,EAAE,CAAA,CAAA;AAChB,EAAK,EAAA,GAAA,IAAA,CAAK,IAAI,EAAE,CAAA,CAAA;AAEhB,EAAA,MAAM,SAAU,IAAK,CAAA,GAAA,CAAI,KAAK,CAAC,CAAA,GAAI,KAAK,GAAI,CAAA,EAAA,EAAI,CAAC,CAAM,GAAA,IAAA,CAAK,IAAI,GAAK,EAAA,CAAC,IAAI,IAAK,CAAA,GAAA,CAAI,IAAI,CAAC,CAAA,CAAA;AAExF,EAAA,IAAI,SAAS,CACb,EAAA;AACI,IAAM,EAAA,IAAA,IAAA,CAAK,KAAK,MAAM,CAAA,CAAA;AACtB,IAAM,EAAA,IAAA,IAAA,CAAK,KAAK,MAAM,CAAA,CAAA;AAAA,GAC1B;AAEA,EAAA,YAAA;AAAA,IACI,EAAA;AAAA,IACA,EAAA;AAAA,IACA,EAAA;AAAA,IACA,EAAA;AAAA,IACA,EAAA;AAAA,IACA,EAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAA;AAAA,GACJ,CAAA;AAEA,EAAI,IAAA,EAAE,IAAM,EAAA,IAAA,EAAS,GAAA,GAAA,CAAA;AACrB,EAAM,MAAA,EAAE,OAAS,EAAA,OAAA,EAAY,GAAA,GAAA,CAAA;AAM7B,EAAA,IAAI,KAAQ,GAAA,IAAA,CAAK,GAAI,CAAA,IAAI,KAAK,GAAM,GAAA,CAAA,CAAA,CAAA;AAEpC,EAAA,IAAI,IAAK,CAAA,GAAA,CAAI,CAAM,GAAA,KAAK,IAAI,IAC5B,EAAA;AACI,IAAQ,KAAA,GAAA,CAAA,CAAA;AAAA,GACZ;AAEA,EAAA,MAAM,WAAW,IAAK,CAAA,GAAA,CAAI,KAAK,IAAK,CAAA,KAAK,GAAG,CAAC,CAAA,CAAA;AAE7C,EAAQ,IAAA,IAAA,QAAA,CAAA;AAER,EAAA,IAAI,KAAQ,GAAA,MAAA,CAAO,MAAO,CAAA,MAAA,GAAS,CAAC,CAAA,CAAA;AACpC,EAAA,IAAI,KAAQ,GAAA,MAAA,CAAO,MAAO,CAAA,MAAA,GAAS,CAAC,CAAA,CAAA;AAEpC,EAAA,MAAM,aAAgB,GAAA,EAAE,CAAG,EAAA,CAAA,EAAG,GAAG,CAAE,EAAA,CAAA;AAEnC,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,QAAA,EAAU,CAC9B,EAAA,EAAA;AACI,IAAM,MAAA,KAAA,GAAQ,aAAc,CAAA,IAAA,EAAM,IAAI,CAAA,CAAA;AAEtC,IAAA,MAAM,EAAE,CAAG,EAAA,EAAA,EAAI,CAAG,EAAA,EAAA,KAAO,YAAa,CAAA,KAAA,CAAM,CAAC,CAAA,EAAG,IAAI,EAAI,EAAA,MAAA,EAAQ,MAAQ,EAAA,OAAA,EAAS,SAAS,aAAa,CAAA,CAAA;AACvG,IAAA,MAAM,EAAE,CAAG,EAAA,EAAA,EAAI,CAAG,EAAA,EAAA,KAAO,YAAa,CAAA,KAAA,CAAM,CAAC,CAAA,EAAG,IAAI,EAAI,EAAA,MAAA,EAAQ,MAAQ,EAAA,OAAA,EAAS,SAAS,aAAa,CAAA,CAAA;AACvG,IAAA,MAAM,EAAE,CAAA,EAAG,CAAE,EAAA,GAAI,aAAa,KAAM,CAAA,CAAC,CAAG,EAAA,EAAA,EAAI,EAAI,EAAA,MAAA,EAAQ,MAAQ,EAAA,OAAA,EAAS,SAAS,aAAa,CAAA,CAAA;AAE/F,IAAA,mBAAA;AAAA,MACI,MAAA;AAAA,MACA,KAAA;AAAA,MAAO,KAAA;AAAA,MACP,EAAA;AAAA,MAAI,EAAA;AAAA,MAAI,EAAA;AAAA,MAAI,EAAA;AAAA,MAAI,CAAA;AAAA,MAAG,CAAA;AAAA,KACvB,CAAA;AAEA,IAAQ,KAAA,GAAA,CAAA,CAAA;AACR,IAAQ,KAAA,GAAA,CAAA,CAAA;AAER,IAAQ,IAAA,IAAA,IAAA,CAAA;AAAA,GACZ;AACJ;;;;"} |