library-ts/browser/geometry/Box2.ts

77 lines
1.5 KiB
TypeScript
Raw Permalink Normal View History

2025-03-25 06:42:27 +00:00
import { Range } from "./Range";
import { Vector2 } from "./Vector2";
export class Box2
{
min:Vector2;
max:Vector2;
2025-09-06 11:33:04 +00:00
static create( min:Vector2, max:Vector2 ):Box2
2025-03-25 06:42:27 +00:00
{
2025-09-06 11:33:04 +00:00
let box = new Box2();
box.min = min;
box.max = max;
return box;
}
static polar( value:number ):Box2
{
return this.create( new Vector2( -value, -value ), new Vector2( value, value ) );
2025-03-25 06:42:27 +00:00
}
get size():Vector2
{
return this.max.clone().sub( this.min );
}
get center():Vector2
{
return this.max.clone().add( this.min ).multiply( 0.5 );
}
get rangeX():Range
{
return new Range( this.min.x, this.max.x );
}
get rangeY():Range
{
return new Range( this.min.y, this.max.y );
}
intersectsBox( box:Box2 )
{
return this.rangeX.overlaps( box.rangeX ) && this.rangeY.overlaps( box.rangeY );
}
translate( offset:Vector2 )
{
this.min.add( offset );
this.max.add( offset );
}
static fromClientRect( clientRect:ClientRect|DOMRect )
{
let min = new Vector2( clientRect.left, clientRect.top );
let max = new Vector2( clientRect.right, clientRect.bottom );
2025-09-06 11:33:04 +00:00
return Box2.create( min, max );
2025-03-25 06:42:27 +00:00
}
static toDomRect( box:Box2 )
{
let size = box.size;
let domRect = new DOMRect( box.min.x, box.min.y, size.x, size.y );
return domRect;
}
static updatefromClientRect( box:Box2, clientRect:ClientRect|DOMRect )
{
box.min.set( clientRect.left, clientRect.top );
box.max.set( clientRect.right, clientRect.bottom );
}
}