@technobuddha/library
Version:
A large library of useful functions
53 lines • 3.62 kB
JavaScript
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=