UNPKG

@technobuddha/library

Version:
53 lines 3.62 kB
import { isOnLine } from "./is-on-line.js"; import { isPolygon } from "./is-polygon.js"; import { lineIntersection } from "./line-intersection.js"; import { lookAhead } from "./look-ahead.js"; import { toClosed } from "./to-closed.js"; import { toLineSegment } from "./to-line-segment.js"; /** * Determines whether a given shape (either a LineSegment or a Polygon) intersects with a polygon. * @param shape - The shape to test for intersection, which can be either a LineSegment or a Polygon. * @param polygon - The polygon to test against. * @returns `true` if the shape intersects with the polygon, otherwise `false`. * @example * ```typescript * isIntersecting( * { x0: -1, y0: 0.5, x1: 2, y1: 0.5 }, * [ { x: 0, y: 0 }, { x: 1, y: 0 }, { x: 1, y: 1 }, { x: 0, y: 1 } ], * ); // true * isIntersecting( * [ { x: 0, y: 0 }, { x: 2, y: 0 }, { x: 1, y: 2 } ], * [ { x: 1, y: 1 }, { x: 3, y: 1 }, { x: 3, y: 3 }, { x: 1, y: 3 } ], * ); // true * ``` * @remarks * - If `shape` is a Polygon, the function checks if any of its edges intersect with the given polygon, * or if two of its vertices lie on the polygon. * - If `shape` is a LineSegment, the function checks if it intersects with any edge of the polygon, * or if both endpoints of a polygon edge lie on the line segment. * @group Geometry * @category Line Segment * @category Polygon */ export function isIntersecting(shape, polygon) { if (isPolygon(shape)) { let intersects = false; for (const [v0, v1] of lookAhead(toClosed(shape))) { if (isIntersecting(toLineSegment(v0, v1), polygon)) { intersects = true; break; } } return intersects; } let intersects = false; for (const [v0, v1] of lookAhead(toClosed(polygon))) { if (lineIntersection(shape, toLineSegment(v0, v1)) || (isOnLine(v0, shape) && isOnLine(v1, shape))) { intersects = true; break; } } return intersects; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtaW50ZXJzZWN0aW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2lzLWludGVyc2VjdGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXJEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQTRCLEVBQUUsT0FBZ0I7SUFDM0UsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNyQixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDdkIsS0FBSyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xELElBQUksY0FBYyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsVUFBVSxHQUFHLElBQUksQ0FBQztnQkFDbEIsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztJQUN2QixLQUFLLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDcEQsSUFDRSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM5QyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUM1QyxDQUFDO1lBQ0QsVUFBVSxHQUFHLElBQUksQ0FBQztZQUNsQixNQUFNO1FBQ1IsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDIn0=