pixi.js
Version:
<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">
1 lines • 4.57 kB
Source Map (JSON)
{"version":3,"file":"getMaxMiterRatio.mjs","sources":["../../../../../src/scene/graphics/shared/utils/getMaxMiterRatio.ts"],"sourcesContent":["import { type Polygon } from '../../../../maths/shapes/Polygon';\n\nimport type { GraphicsPath } from '../path/GraphicsPath';\n\n/**\n * Computes the maximum miter ratio from polygon corner angles in a graphics path.\n * The miter ratio determines how much the stroke padding must expand to contain miter joins\n * at sharp angles. Returns a value >= 1, clamped by the miterLimit.\n * @param path - The graphics path containing polygon shapes\n * @param miterLimit - The maximum allowed miter ratio\n * @returns The maximum miter ratio found in all polygon corners, clamped by miterLimit\n * @internal\n */\nexport function getMaxMiterRatio(path: GraphicsPath, miterLimit: number): number\n{\n let maxRatio = 1;\n\n const shapePrimitives = path.shapePath.shapePrimitives;\n\n for (let i = 0; i < shapePrimitives.length; i++)\n {\n const shape = shapePrimitives[i].shape;\n\n if (shape.type !== 'polygon') continue;\n\n const points = (shape as Polygon).points;\n const n = points.length;\n\n if (n < 6) continue;\n\n const closed = (shape as Polygon).closePath;\n\n for (let j = 0; j < n; j += 2)\n {\n // For open paths, skip first and last points (they use caps, not joins)\n if (!closed && (j === 0 || j === n - 2)) continue;\n\n const prevIdx = (j - 2 + n) % n;\n const nextIdx = (j + 2) % n;\n\n const x0 = points[prevIdx];\n const y0 = points[prevIdx + 1];\n const x1 = points[j];\n const y1 = points[j + 1];\n const x2 = points[nextIdx];\n const y2 = points[nextIdx + 1];\n\n const dx0 = x0 - x1;\n const dy0 = y0 - y1;\n const dx1 = x2 - x1;\n const dy1 = y2 - y1;\n\n const len0Sq = (dx0 * dx0) + (dy0 * dy0);\n const len1Sq = (dx1 * dx1) + (dy1 * dy1);\n\n if (len0Sq < 1e-12 || len1Sq < 1e-12) continue;\n\n const dot = (dx0 * dx1) + (dy0 * dy1);\n const cosAngle = dot / Math.sqrt(len0Sq * len1Sq);\n let clampedCos = cosAngle;\n\n if (clampedCos < -1) clampedCos = -1;\n else if (clampedCos > 1) clampedCos = 1;\n\n const sinHalfAngle = Math.sqrt((1 - clampedCos) * 0.5);\n\n if (sinHalfAngle < 1e-6) continue;\n\n const miterRatio = Math.min(1 / sinHalfAngle, miterLimit);\n\n if (miterRatio > maxRatio) maxRatio = miterRatio;\n }\n }\n\n return maxRatio;\n}\n"],"names":[],"mappings":";AAaO,SAAS,gBAAA,CAAiB,MAAoB,UAAA,EACrD;AACI,EAAA,IAAI,QAAA,GAAW,CAAA;AAEf,EAAA,MAAM,eAAA,GAAkB,KAAK,SAAA,CAAU,eAAA;AAEvC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,eAAA,CAAgB,QAAQ,CAAA,EAAA,EAC5C;AACI,IAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,CAAC,CAAA,CAAE,KAAA;AAEjC,IAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAE9B,IAAA,MAAM,SAAU,KAAA,CAAkB,MAAA;AAClC,IAAA,MAAM,IAAI,MAAA,CAAO,MAAA;AAEjB,IAAA,IAAI,IAAI,CAAA,EAAG;AAEX,IAAA,MAAM,SAAU,KAAA,CAAkB,SAAA;AAElC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,KAAK,CAAA,EAC5B;AAEI,MAAA,IAAI,CAAC,MAAA,KAAW,CAAA,KAAM,CAAA,IAAK,CAAA,KAAM,IAAI,CAAA,CAAA,EAAI;AAEzC,MAAA,MAAM,OAAA,GAAA,CAAW,CAAA,GAAI,CAAA,GAAI,CAAA,IAAK,CAAA;AAC9B,MAAA,MAAM,OAAA,GAAA,CAAW,IAAI,CAAA,IAAK,CAAA;AAE1B,MAAA,MAAM,EAAA,GAAK,OAAO,OAAO,CAAA;AACzB,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,OAAA,GAAU,CAAC,CAAA;AAC7B,MAAA,MAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AACnB,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACvB,MAAA,MAAM,EAAA,GAAK,OAAO,OAAO,CAAA;AACzB,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,OAAA,GAAU,CAAC,CAAA;AAE7B,MAAA,MAAM,MAAM,EAAA,GAAK,EAAA;AACjB,MAAA,MAAM,MAAM,EAAA,GAAK,EAAA;AACjB,MAAA,MAAM,MAAM,EAAA,GAAK,EAAA;AACjB,MAAA,MAAM,MAAM,EAAA,GAAK,EAAA;AAEjB,MAAA,MAAM,MAAA,GAAU,GAAA,GAAM,GAAA,GAAQ,GAAA,GAAM,GAAA;AACpC,MAAA,MAAM,MAAA,GAAU,GAAA,GAAM,GAAA,GAAQ,GAAA,GAAM,GAAA;AAEpC,MAAA,IAAI,MAAA,GAAS,KAAA,IAAS,MAAA,GAAS,KAAA,EAAO;AAEtC,MAAA,MAAM,GAAA,GAAO,GAAA,GAAM,GAAA,GAAQ,GAAA,GAAM,GAAA;AACjC,MAAA,MAAM,QAAA,GAAW,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,SAAS,MAAM,CAAA;AAChD,MAAA,IAAI,UAAA,GAAa,QAAA;AAEjB,MAAA,IAAI,UAAA,GAAa,IAAI,UAAA,GAAa,CAAA,CAAA;AAAA,WAAA,IACzB,UAAA,GAAa,GAAG,UAAA,GAAa,CAAA;AAEtC,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,CAAA,CAAM,CAAA,GAAI,cAAc,GAAG,CAAA;AAErD,MAAA,IAAI,eAAe,IAAA,EAAM;AAEzB,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,cAAc,UAAU,CAAA;AAExD,MAAA,IAAI,UAAA,GAAa,UAAU,QAAA,GAAW,UAAA;AAAA,IAC1C;AAAA,EACJ;AAEA,EAAA,OAAO,QAAA;AACX;;;;"}