sdfsdfs
This commit is contained in:
164
node_modules/pixi.js/lib/maths/shapes/Polygon.mjs
generated
vendored
Normal file
164
node_modules/pixi.js/lib/maths/shapes/Polygon.mjs
generated
vendored
Normal file
@@ -0,0 +1,164 @@
|
||||
import { squaredDistanceToLineSegment } from '../misc/squaredDistanceToLineSegment.mjs';
|
||||
import { Rectangle } from './Rectangle.mjs';
|
||||
|
||||
"use strict";
|
||||
class Polygon {
|
||||
/**
|
||||
* @param points - This can be an array of Points
|
||||
* that form the polygon, a flat array of numbers that will be interpreted as [x,y, x,y, ...], or
|
||||
* the arguments passed can be all the points of the polygon e.g.
|
||||
* `new Polygon(new Point(), new Point(), ...)`, or the arguments passed can be flat
|
||||
* x,y values e.g. `new Polygon(x,y, x,y, x,y, ...)` where `x` and `y` are Numbers.
|
||||
*/
|
||||
constructor(...points) {
|
||||
/**
|
||||
* The type of the object, mainly used to avoid `instanceof` checks
|
||||
* @default 'polygon'
|
||||
*/
|
||||
this.type = "polygon";
|
||||
let flat = Array.isArray(points[0]) ? points[0] : points;
|
||||
if (typeof flat[0] !== "number") {
|
||||
const p = [];
|
||||
for (let i = 0, il = flat.length; i < il; i++) {
|
||||
p.push(flat[i].x, flat[i].y);
|
||||
}
|
||||
flat = p;
|
||||
}
|
||||
this.points = flat;
|
||||
this.closePath = true;
|
||||
}
|
||||
/**
|
||||
* Creates a clone of this polygon.
|
||||
* @returns - A copy of the polygon.
|
||||
*/
|
||||
clone() {
|
||||
const points = this.points.slice();
|
||||
const polygon = new Polygon(points);
|
||||
polygon.closePath = this.closePath;
|
||||
return polygon;
|
||||
}
|
||||
/**
|
||||
* Checks whether the x and y coordinates passed to this function are contained within this polygon.
|
||||
* @param x - The X coordinate of the point to test.
|
||||
* @param y - The Y coordinate of the point to test.
|
||||
* @returns - Whether the x/y coordinates are within this polygon.
|
||||
*/
|
||||
contains(x, y) {
|
||||
let inside = false;
|
||||
const length = this.points.length / 2;
|
||||
for (let i = 0, j = length - 1; i < length; j = i++) {
|
||||
const xi = this.points[i * 2];
|
||||
const yi = this.points[i * 2 + 1];
|
||||
const xj = this.points[j * 2];
|
||||
const yj = this.points[j * 2 + 1];
|
||||
const intersect = yi > y !== yj > y && x < (xj - xi) * ((y - yi) / (yj - yi)) + xi;
|
||||
if (intersect) {
|
||||
inside = !inside;
|
||||
}
|
||||
}
|
||||
return inside;
|
||||
}
|
||||
/**
|
||||
* Checks whether the x and y coordinates given are contained within this polygon including the stroke.
|
||||
* @param x - The X coordinate of the point to test
|
||||
* @param y - The Y coordinate of the point to test
|
||||
* @param strokeWidth - The width of the line to check
|
||||
* @returns Whether the x/y coordinates are within this polygon
|
||||
*/
|
||||
strokeContains(x, y, strokeWidth) {
|
||||
const halfStrokeWidth = strokeWidth / 2;
|
||||
const halfStrokeWidthSqrd = halfStrokeWidth * halfStrokeWidth;
|
||||
const { points } = this;
|
||||
const iterationLength = points.length - (this.closePath ? 0 : 2);
|
||||
for (let i = 0; i < iterationLength; i += 2) {
|
||||
const x1 = points[i];
|
||||
const y1 = points[i + 1];
|
||||
const x2 = points[(i + 2) % points.length];
|
||||
const y2 = points[(i + 3) % points.length];
|
||||
const distanceSqrd = squaredDistanceToLineSegment(x, y, x1, y1, x2, y2);
|
||||
if (distanceSqrd <= halfStrokeWidthSqrd) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* Returns the framing rectangle of the polygon as a Rectangle object
|
||||
* @param out - optional rectangle to store the result
|
||||
* @returns The framing rectangle
|
||||
*/
|
||||
getBounds(out) {
|
||||
out = out || new Rectangle();
|
||||
const points = this.points;
|
||||
let minX = Infinity;
|
||||
let maxX = -Infinity;
|
||||
let minY = Infinity;
|
||||
let maxY = -Infinity;
|
||||
for (let i = 0, n = points.length; i < n; i += 2) {
|
||||
const x = points[i];
|
||||
const y = points[i + 1];
|
||||
minX = x < minX ? x : minX;
|
||||
maxX = x > maxX ? x : maxX;
|
||||
minY = y < minY ? y : minY;
|
||||
maxY = y > maxY ? y : maxY;
|
||||
}
|
||||
out.x = minX;
|
||||
out.width = maxX - minX;
|
||||
out.y = minY;
|
||||
out.height = maxY - minY;
|
||||
return out;
|
||||
}
|
||||
/**
|
||||
* Copies another polygon to this one.
|
||||
* @param polygon - The polygon to copy from.
|
||||
* @returns Returns itself.
|
||||
*/
|
||||
copyFrom(polygon) {
|
||||
this.points = polygon.points.slice();
|
||||
this.closePath = polygon.closePath;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Copies this polygon to another one.
|
||||
* @param polygon - The polygon to copy to.
|
||||
* @returns Returns given parameter.
|
||||
*/
|
||||
copyTo(polygon) {
|
||||
polygon.copyFrom(this);
|
||||
return polygon;
|
||||
}
|
||||
toString() {
|
||||
return `[pixi.js/math:PolygoncloseStroke=${this.closePath}points=${this.points.reduce((pointsDesc, currentPoint) => `${pointsDesc}, ${currentPoint}`, "")}]`;
|
||||
}
|
||||
/**
|
||||
* Get the last X coordinate of the polygon
|
||||
* @readonly
|
||||
*/
|
||||
get lastX() {
|
||||
return this.points[this.points.length - 2];
|
||||
}
|
||||
/**
|
||||
* Get the last Y coordinate of the polygon
|
||||
* @readonly
|
||||
*/
|
||||
get lastY() {
|
||||
return this.points[this.points.length - 1];
|
||||
}
|
||||
/**
|
||||
* Get the first X coordinate of the polygon
|
||||
* @readonly
|
||||
*/
|
||||
get x() {
|
||||
return this.points[this.points.length - 2];
|
||||
}
|
||||
/**
|
||||
* Get the first Y coordinate of the polygon
|
||||
* @readonly
|
||||
*/
|
||||
get y() {
|
||||
return this.points[this.points.length - 1];
|
||||
}
|
||||
}
|
||||
|
||||
export { Polygon };
|
||||
//# sourceMappingURL=Polygon.mjs.map
|
Reference in New Issue
Block a user