You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.2 KiB
69 lines
1.2 KiB
import type { DisplayObject } from '../shapes';
|
|
|
|
export class BBox {
|
|
public x = 0;
|
|
|
|
public y = 0;
|
|
|
|
public width = 0;
|
|
|
|
public height = 0;
|
|
|
|
public get bottom() {
|
|
return this.y + this.height;
|
|
}
|
|
|
|
public get left() {
|
|
return this.x;
|
|
}
|
|
|
|
public get right() {
|
|
return this.x + this.width;
|
|
}
|
|
|
|
public get top() {
|
|
return this.y;
|
|
}
|
|
|
|
constructor(x = 0, y = 0, width = 0, height = 0) {
|
|
this.x = x;
|
|
this.y = y;
|
|
this.width = width;
|
|
this.height = height;
|
|
}
|
|
|
|
static fromRect(other: DOMRect) {
|
|
return new BBox(other.x, other.y, other.width, other.height);
|
|
}
|
|
|
|
toJSON() {
|
|
return {
|
|
x: this.x,
|
|
y: this.y,
|
|
width: this.width,
|
|
height: this.height,
|
|
top: this.top,
|
|
right: this.right,
|
|
bottom: this.bottom,
|
|
left: this.left,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* 点是否在 bbox 中
|
|
* @param p
|
|
*/
|
|
public isPointIn(x: number, y: number) {
|
|
return x >= this.left && x <= this.right && y >= this.top && y <= this.bottom;
|
|
}
|
|
}
|
|
|
|
export function getRenderBBox(element: DisplayObject) {
|
|
const {
|
|
min: [minX, minY],
|
|
max: [maxX, maxY],
|
|
} = element.getRenderBounds();
|
|
const width = maxX - minX;
|
|
const height = maxY - minY;
|
|
return new BBox(minX, minY, width, height);
|
|
}
|
|
|