1 line
12 KiB
Plaintext
1 line
12 KiB
Plaintext
{"version":3,"file":"Polygon.mjs","sources":["../../../src/maths/shapes/Polygon.ts"],"sourcesContent":["import { squaredDistanceToLineSegment } from '../misc/squaredDistanceToLineSegment';\nimport { Rectangle } from './Rectangle';\n\nimport type { SHAPE_PRIMITIVE } from '../misc/const';\nimport type { PointData } from '../point/PointData';\nimport type { ShapePrimitive } from './ShapePrimitive';\n\n/**\n * A class to define a shape via user defined coordinates.\n *\n *\n * `Polygon` can accept the following different constructor arguments:\n * - An array of `Point` objects\n * - An array of coordinate pairs\n *\n *\n * These can be passed as a single array, or as a sequence of arguments.\n * ```js\n * import { Polygon } from 'pixi.js';\n *\n * // create a polygon object from an array of points, or an array of coordinate pairs\n * const polygon1 = new Polygon([ new Point(0, 0), new Point(0, 100), new Point(100, 100) ]);\n * const polygon2 = new Polygon([ 0, 0, 0, 100, 100, 100 ]);\n *\n * // or create a polygon object from a sequence of points, or coordinate pairs\n * const polygon3 = new Polygon(new Point(0, 0), new Point(0, 100), new Point(100, 100));\n * const polygon4 = new Polygon(0, 0, 0, 100, 100, 100);\n * ```\n * @memberof maths\n */\nexport class Polygon implements ShapePrimitive\n{\n /** An array of the points of this polygon. */\n public points: number[];\n\n /** `false` after moveTo, `true` after `closePath`. In all other cases it is `true`. */\n public closePath: boolean;\n\n /**\n * The type of the object, mainly used to avoid `instanceof` checks\n * @default 'polygon'\n */\n public readonly type: SHAPE_PRIMITIVE = 'polygon';\n\n constructor(points: PointData[] | number[]);\n constructor(...points: PointData[] | number[]);\n /**\n * @param points - This can be an array of Points\n * that form the polygon, a flat array of numbers that will be interpreted as [x,y, x,y, ...], or\n * the arguments passed can be all the points of the polygon e.g.\n * `new Polygon(new Point(), new Point(), ...)`, or the arguments passed can be flat\n * x,y values e.g. `new Polygon(x,y, x,y, x,y, ...)` where `x` and `y` are Numbers.\n */\n constructor(...points: (PointData[] | number[])[] | PointData[] | number[])\n {\n let flat = Array.isArray(points[0]) ? points[0] : points;\n\n // if this is an array of points, convert it to a flat array of numbers\n if (typeof flat[0] !== 'number')\n {\n const p: number[] = [];\n\n for (let i = 0, il = flat.length; i < il; i++)\n {\n p.push((flat[i] as PointData).x, (flat[i] as PointData).y);\n }\n\n flat = p;\n }\n\n this.points = flat as number[];\n\n this.closePath = true;\n }\n\n /**\n * Creates a clone of this polygon.\n * @returns - A copy of the polygon.\n */\n public clone(): Polygon\n {\n const points = this.points.slice();\n const polygon = new Polygon(points);\n\n polygon.closePath = this.closePath;\n\n return polygon;\n }\n\n /**\n * Checks whether the x and y coordinates passed to this function are contained within this polygon.\n * @param x - The X coordinate of the point to test.\n * @param y - The Y coordinate of the point to test.\n * @returns - Whether the x/y coordinates are within this polygon.\n */\n public contains(x: number, y: number): boolean\n {\n let inside = false;\n\n // use some raycasting to test hits\n // https://github.com/substack/point-in-polygon/blob/master/index.js\n const length = this.points.length / 2;\n\n for (let i = 0, j = length - 1; i < length; j = i++)\n {\n const xi = this.points[i * 2];\n const yi = this.points[(i * 2) + 1];\n const xj = this.points[j * 2];\n const yj = this.points[(j * 2) + 1];\n const intersect = ((yi > y) !== (yj > y)) && (x < ((xj - xi) * ((y - yi) / (yj - yi))) + xi);\n\n if (intersect)\n {\n inside = !inside;\n }\n }\n\n return inside;\n }\n\n /**\n * Checks whether the x and y coordinates given are contained within this polygon including the stroke.\n * @param x - The X coordinate of the point to test\n * @param y - The Y coordinate of the point to test\n * @param strokeWidth - The width of the line to check\n * @returns Whether the x/y coordinates are within this polygon\n */\n public strokeContains(x: number, y: number, strokeWidth: number): boolean\n {\n const halfStrokeWidth = strokeWidth / 2;\n const halfStrokeWidthSqrd = halfStrokeWidth * halfStrokeWidth;\n const { points } = this;\n const iterationLength = points.length - (this.closePath ? 0 : 2);\n\n for (let i = 0; i < iterationLength; i += 2)\n {\n const x1 = points[i];\n const y1 = points[i + 1];\n const x2 = points[(i + 2) % points.length];\n const y2 = points[(i + 3) % points.length];\n\n const distanceSqrd = squaredDistanceToLineSegment(x, y, x1, y1, x2, y2);\n\n if (distanceSqrd <= halfStrokeWidthSqrd)\n {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Returns the framing rectangle of the polygon as a Rectangle object\n * @param out - optional rectangle to store the result\n * @returns The framing rectangle\n */\n public getBounds(out?: Rectangle): Rectangle\n {\n out = out || new Rectangle();\n\n const points = this.points;\n\n let minX = Infinity;\n let maxX = -Infinity;\n\n let minY = Infinity;\n let maxY = -Infinity;\n\n for (let i = 0, n = points.length; i < n; i += 2)\n {\n const x = points[i];\n const y = points[i + 1];\n\n minX = x < minX ? x : minX;\n maxX = x > maxX ? x : maxX;\n\n minY = y < minY ? y : minY;\n maxY = y > maxY ? y : maxY;\n }\n\n out.x = minX;\n out.width = maxX - minX;\n\n out.y = minY;\n out.height = maxY - minY;\n\n return out;\n }\n\n /**\n * Copies another polygon to this one.\n * @param polygon - The polygon to copy from.\n * @returns Returns itself.\n */\n public copyFrom(polygon: Polygon): this\n {\n this.points = polygon.points.slice();\n this.closePath = polygon.closePath;\n\n return this;\n }\n\n /**\n * Copies this polygon to another one.\n * @param polygon - The polygon to copy to.\n * @returns Returns given parameter.\n */\n public copyTo(polygon: Polygon): Polygon\n {\n polygon.copyFrom(this);\n\n return polygon;\n }\n\n // #if _DEBUG\n public toString(): string\n {\n return `[pixi.js/math:Polygon`\n + `closeStroke=${this.closePath}`\n + `points=${this.points.reduce((pointsDesc, currentPoint) => `${pointsDesc}, ${currentPoint}`, '')}]`;\n }\n // #endif\n\n /**\n * Get the last X coordinate of the polygon\n * @readonly\n */\n get lastX(): number\n {\n return this.points[this.points.length - 2];\n }\n\n /**\n * Get the last Y coordinate of the polygon\n * @readonly\n */\n get lastY(): number\n {\n return this.points[this.points.length - 1];\n }\n\n /**\n * Get the first X coordinate of the polygon\n * @readonly\n */\n get x(): number\n {\n return this.points[this.points.length - 2];\n }\n /**\n * Get the first Y coordinate of the polygon\n * @readonly\n */\n get y(): number\n {\n return this.points[this.points.length - 1];\n }\n}\n\n"],"names":[],"mappings":"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"} |