@technobuddha/library
Version:
A large library of useful functions
43 lines • 2.48 kB
JavaScript
/**
* 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