1 line
26 KiB
Plaintext
1 line
26 KiB
Plaintext
|
|
{"version":3,"file":"PolyBuilder.mjs","sources":["../../src/shapes/PolyBuilder.ts"],"sourcesContent":["import type { IShapeBuilder } from '../core/IShapeBuilder';\r\nimport { SmoothGraphicsData } from '../core/SmoothGraphicsData';\r\nimport { BuildData } from '../core/BuildData';\r\nimport { JOINT_TYPE } from '../core/const';\r\nimport { Point, Polygon, utils } from '@pixi/core';\r\n\r\nconst tempArr: Array<number> = [];\r\n\r\nfunction fixOrientation(points: number[], hole = false)\r\n{\r\n const m = points.length;\r\n\r\n if (m < 6)\r\n {\r\n return;\r\n }\r\n\r\n let area = 0;\r\n\r\n for (let i = 0, x1 = points[m - 2], y1 = points[m - 1]; i < m; i += 2)\r\n {\r\n const x2 = points[i];\r\n const y2 = points[i + 1];\r\n\r\n area += (x2 - x1) * (y2 + y1);\r\n\r\n x1 = x2;\r\n y1 = y2;\r\n }\r\n\r\n if ((!hole && area > 0) || (hole && area <= 0))\r\n {\r\n const n = m / 2;\r\n\r\n for (let i = n + (n % 2); i < m; i += 2)\r\n {\r\n const i1 = m - i - 2;\r\n const i2 = m - i - 1;\r\n const i3 = i;\r\n const i4 = i + 1;\r\n\r\n [points[i1], points[i3]] = [points[i3], points[i1]];\r\n [points[i2], points[i4]] = [points[i4], points[i2]];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * @memberof PIXI.smooth\r\n */\r\nexport class PolyBuilder implements IShapeBuilder\r\n{\r\n path(graphicsData: SmoothGraphicsData, buildData: BuildData)\r\n {\r\n const shape = graphicsData.shape as Polygon;\r\n const points = graphicsData.points = shape.points.slice();\r\n const eps = buildData.closePointEps;\r\n const eps2 = eps * eps;\r\n\r\n if (points.length === 0)\r\n {\r\n return;\r\n }\r\n\r\n const firstPoint = new Point(points[0], points[1]);\r\n const lastPoint = new Point(points[points.length - 2], points[points.length - 1]);\r\n const closedShape = graphicsData.closeStroke = shape.closeStroke;\r\n\r\n let len = points.length;\r\n let newLen = 2;\r\n\r\n // 1. remove equal points\r\n for (let i = 2; i < len; i += 2)\r\n {\r\n const x1 = points[i - 2];\r\n const y1 = points[i - 1];\r\n const x2 = points[i];\r\n const y2 = points[i + 1];\r\n let flag = true;\r\n\r\n if (Math.abs(x1 - x2) < eps\r\n && Math.abs(y1 - y2) < eps)\r\n {\r\n flag = false;\r\n }\r\n\r\n if (flag)\r\n {\r\n points[newLen] = points[i];\r\n points[newLen + 1] = points[i + 1];\r\n newLen += 2;\r\n }\r\n }\r\n points.length = len = newLen;\r\n\r\n newLen = 2;\r\n // 2. remove middle points\r\n for (let i = 2; i + 2 < len; i += 2)\r\n {\r\n let x1 = points[i - 2];\r\n let y1 = points[i - 1];\r\n const x2 = points[i];\r\n const y2 = points[i + 1];\r\n let x3 = points[i + 2];\r\n let y3 = points[i + 3];\r\n\r\n x1 -= x2;\r\n y1 -= y2;\r\n x3 -= x2;\r\n y3 -= y2;\r\n let flag = true;\r\n\r\n if (Math.abs((x3 * y1) - (y3 * x1)) < eps2)\r\n {\r\n if ((x1 * x3) + (y1 * y3) < -eps2)\r\n {\r\n flag = false;\r\n }\r\n }\r\n\r\n if (flag)\r\n {\r\n points[newLen] = points[i];\r\n points[newLen + 1] = points[i + 1];\r\n newLen += 2;\r\n }\r\n }\r\n points[newLen] = points[len - 2];\r\n points[newLen + 1] = points[len - 1];\r\n newLen += 2;\r\n\r\n points.length = len = newLen;\r\n\r\n if (len <= 2)\r\n {\r\n // suddenly, nothing\r\n return;\r\n }\r\n\r\n if (closedShape)\r\n {\r\n
|