Files
nothoughts/node_modules/pixi.js/lib/scene/graphics/shared/path/roundShape.mjs.map
2025-08-04 18:57:35 +02:00

1 line
11 KiB
Plaintext

{"version":3,"file":"roundShape.mjs","sources":["../../../../../src/scene/graphics/shared/path/roundShape.ts"],"sourcesContent":["import type { PointData } from '../../../../maths/point/PointData';\nimport type { ShapePath } from './ShapePath';\n\n/**\n * Typed and cleaned up version of:\n * https://stackoverflow.com/questions/44855794/html5-canvas-triangle-with-rounded-corners/44856925#44856925\n * @param g - Graphics to be drawn on.\n * @param points - Corners of the shape to draw. Minimum length is 3.\n * @param radius - Corners default radius.\n * @ignore\n */\nexport function roundedShapeArc(\n g: ShapePath,\n points: RoundedPoint[],\n radius: number\n): void\n{\n const vecFrom = (p: PointData, pp: PointData) =>\n {\n const x = pp.x - p.x;\n const y = pp.y - p.y;\n const len = Math.sqrt((x * x) + (y * y));\n const nx = x / len;\n const ny = y / len;\n\n return { len, nx, ny };\n };\n\n const sharpCorner = (i: number, p: PointData) =>\n {\n if (i === 0)\n {\n g.moveTo(p.x, p.y);\n }\n else\n {\n g.lineTo(p.x, p.y);\n }\n };\n\n let p1 = points[points.length - 1];\n\n for (let i = 0; i < points.length; i++)\n {\n const p2 = points[i % points.length];\n const pRadius = p2.radius ?? radius;\n\n if (pRadius <= 0)\n {\n sharpCorner(i, p2);\n p1 = p2;\n continue;\n }\n\n const p3 = points[(i + 1) % points.length];\n const v1 = vecFrom(p2, p1);\n const v2 = vecFrom(p2, p3);\n\n if (v1.len < 1e-4 || v2.len < 1e-4)\n {\n sharpCorner(i, p2);\n p1 = p2;\n continue;\n }\n\n let angle = Math.asin((v1.nx * v2.ny) - (v1.ny * v2.nx));\n let radDirection = 1;\n let drawDirection = false;\n\n if ((v1.nx * v2.nx) - (v1.ny * -v2.ny) < 0)\n {\n if (angle < 0)\n {\n angle = Math.PI + angle;\n }\n else\n {\n angle = Math.PI - angle;\n radDirection = -1;\n drawDirection = true;\n }\n }\n else if (angle > 0)\n {\n radDirection = -1;\n drawDirection = true;\n }\n\n const halfAngle = angle / 2;\n\n let cRadius: number;\n let lenOut = Math.abs(\n (Math.cos(halfAngle) * pRadius) / Math.sin(halfAngle)\n );\n\n if (lenOut > Math.min(v1.len / 2, v2.len / 2))\n {\n lenOut = Math.min(v1.len / 2, v2.len / 2);\n cRadius = Math.abs((lenOut * Math.sin(halfAngle)) / Math.cos(halfAngle));\n }\n else\n {\n cRadius = pRadius;\n }\n\n const cX = p2.x + (v2.nx * lenOut) + (-v2.ny * cRadius * radDirection);\n const cY = p2.y + (v2.ny * lenOut) + (v2.nx * cRadius * radDirection);\n const startAngle = Math.atan2(v1.ny, v1.nx) + ((Math.PI / 2) * radDirection);\n const endAngle = Math.atan2(v2.ny, v2.nx) - ((Math.PI / 2) * radDirection);\n\n if (i === 0)\n {\n g.moveTo(\n cX + (Math.cos(startAngle) * cRadius),\n cY + (Math.sin(startAngle) * cRadius)\n );\n }\n\n g.arc(cX, cY, cRadius, startAngle, endAngle, drawDirection);\n\n p1 = p2;\n }\n}\n\nexport type RoundedPoint = PointData & { radius?: number };\n\n/**\n * Typed and cleaned up version of:\n * https://stackoverflow.com/questions/44855794/html5-canvas-triangle-with-rounded-corners/56214413#56214413\n * @param g - Graphics to be drawn on.\n * @param points - Corners of the shape to draw. Minimum length is 3.\n * @param radius - Corners default radius.\n * @ignore\n */\nexport function roundedShapeQuadraticCurve(\n g: ShapePath,\n points: RoundedPoint[],\n radius: number,\n smoothness?: number,\n): void\n{\n const distance = (p1: PointData, p2: PointData) =>\n Math.sqrt(((p1.x - p2.x) ** 2) + ((p1.y - p2.y) ** 2));\n\n const pointLerp = (p1: PointData, p2: PointData, t: number) => ({\n x: p1.x + ((p2.x - p1.x) * t),\n y: p1.y + ((p2.y - p1.y) * t),\n });\n\n const numPoints = points.length;\n\n for (let i = 0; i < numPoints; i++)\n {\n const thisPoint = points[(i + 1) % numPoints];\n const pRadius = thisPoint.radius ?? radius;\n\n if (pRadius <= 0)\n {\n if (i === 0)\n {\n g.moveTo(thisPoint.x, thisPoint.y);\n }\n else\n {\n g.lineTo(thisPoint.x, thisPoint.y);\n }\n\n continue;\n }\n\n const lastPoint = points[i];\n const nextPoint = points[(i + 2) % numPoints];\n\n const lastEdgeLength = distance(lastPoint, thisPoint);\n let start;\n\n if (lastEdgeLength < 1e-4)\n {\n start = thisPoint;\n }\n else\n {\n const lastOffsetDistance = Math.min(lastEdgeLength / 2, pRadius);\n\n start = pointLerp(\n thisPoint,\n lastPoint,\n lastOffsetDistance / lastEdgeLength\n );\n }\n\n const nextEdgeLength = distance(nextPoint, thisPoint);\n let end;\n\n if (nextEdgeLength < 1e-4)\n {\n end = thisPoint;\n }\n else\n {\n const nextOffsetDistance = Math.min(nextEdgeLength / 2, pRadius);\n\n end = pointLerp(\n thisPoint,\n nextPoint,\n nextOffsetDistance / nextEdgeLength\n );\n }\n\n if (i === 0)\n {\n g.moveTo(start.x, start.y);\n }\n else\n {\n g.lineTo(start.x, start.y);\n }\n g.quadraticCurveTo(thisPoint.x, thisPoint.y, end.x, end.y, smoothness);\n }\n}\n"],"names":[],"mappings":"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"}