@mlightcad/libredwg-web
Version:
A DWG/DXF JavaScript parser based on libredwg
104 lines • 3.18 kB
JavaScript
/**
* Represents a 2D axis-aligned bounding box.
*/
export class Box2D {
min;
max;
valid;
constructor() {
this.min = { x: Infinity, y: Infinity };
this.max = { x: -Infinity, y: -Infinity };
this.valid = false;
}
/**
* Expands the bounding box to include a given point.
*
* @param point - The point to include in the bounding box.
* @returns This bounding box after expansion.
*/
expandByPoint(point) {
this.min.x = Math.min(this.min.x, point.x);
this.min.y = Math.min(this.min.y, point.y);
this.max.x = Math.max(this.max.x, point.x);
this.max.y = Math.max(this.max.y, point.y);
this.valid = true;
return this;
}
/**
* Applies a scaling and translation transformation to this bounding box.
*
* @param scale - The scaling factors in x and y directions.
* @param translation - The translation offsets in x and y directions.
* @returns This bounding box after transformation.
*/
transform(scale, translation) {
const corners = this.getCorners().map(p => ({
x: p.x * scale.x + translation.x,
y: p.y * scale.y + translation.y
}));
this.reset();
for (const pt of corners) {
this.expandByPoint(pt);
}
return this;
}
/**
* Applies a rotation around a specific point to this bounding box.
*
* @param angleInRad - The angle of rotation in radians.
* @param point - The center of rotation.
* @returns This bounding box after rotation.
*/
rotate(angleInRad, point) {
const cos = Math.cos(angleInRad);
const sin = Math.sin(angleInRad);
const corners = this.getCorners().map(p => {
const dx = p.x - point.x;
const dy = p.y - point.y;
return {
x: point.x + dx * cos - dy * sin,
y: point.y + dx * sin + dy * cos
};
});
this.reset();
for (const pt of corners) {
this.expandByPoint(pt);
}
return this;
}
/**
* Creates a deep copy of this bounding box.
*
* @returns A new instance of Box2D with the same properties.
*/
clone() {
const box = new Box2D();
box.min = { x: this.min.x, y: this.min.y };
box.max = { x: this.max.x, y: this.max.y };
box.valid = this.valid;
return box;
}
/**
* Resets this bounding box to its initial unbounded state.
*/
reset() {
this.min = { x: Infinity, y: Infinity };
this.max = { x: -Infinity, y: -Infinity };
this.valid = false;
}
/**
* Retrieves the four corner points of the bounding box.
*
* @returns An array of corner points in the order:
* bottom-left, top-left, bottom-right, top-right.
*/
getCorners() {
return [
{ x: this.min.x, y: this.min.y },
{ x: this.min.x, y: this.max.y },
{ x: this.max.x, y: this.min.y },
{ x: this.max.x, y: this.max.y }
];
}
}
//# sourceMappingURL=box2d.js.map