UNPKG

@technobuddha/library

Version:
43 lines 2.48 kB
/** * Calculates the axis-aligned bounding rectangle for a given polygon. * @param vertices - The polygon. * @returns A {@link Rect} representing the smallest rectangle that contains the polygon. * @throws `TypeError` If the polygon has fewer than three vertices. * @example * ```typescript * bounds([ * { x: 0, y: 0 }, * { x: 0, y: 5 }, * { x: 10, y: 5 }, * { x: 10, y: 0 }, * ]); * // { x: 0, y: 0, width: 10, height: 5 } * ``` * @group Geometry * @category Polygon */ export function bounds(vertices) { if (vertices.length < 3) { throw new TypeError('Cannot calculate bounds for an polygon with less than three sides.'); } let xMin = Infinity; let xMax = -Infinity; let yMin = Infinity; let yMax = -Infinity; for (const vertex of vertices) { if (vertex.x < xMin) { xMin = vertex.x; } if (vertex.x > xMax) { xMax = vertex.x; } if (vertex.y < yMin) { yMin = vertex.y; } if (vertex.y > yMax) { yMax = vertex.y; } } return { x: xMin, y: yMin, width: xMax - xMin, height: yMax - yMin }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm91bmRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2JvdW5kcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFFBQWlCO0lBQ3RDLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN4QixNQUFNLElBQUksU0FBUyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUVELElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQztJQUNwQixJQUFJLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUNyQixJQUFJLElBQUksR0FBRyxRQUFRLENBQUM7SUFDcEIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFFckIsS0FBSyxNQUFNLE1BQU0sSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUM5QixJQUFJLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUM7WUFDcEIsSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUNwQixJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDO1lBQ3BCLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUM7WUFDcEIsSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUM7QUFDdkUsQ0FBQyJ9