const diagRect = require("./diagRect");
const Static = require("../objects");
const Vertices = require("./vertex");
/**
* Get bounding box from an array of vectors.
*
* @constructor
* @memberof PhSim
* @extends PhSim.Options.Rectangle
* @param {Vector[]} verts
*/
const BoundingBox = function(verts) {
verts = Object.assign([],verts);
verts.sort(function(a,b){
return a.x - b.x;
});
/**
* The x coordinate of the left most vertex of `verts`.
* @type {Number}
*/
this.smallX = verts[0].x;
/**
* The x coordinate of the right most vertex of `verts`.
* @type {Number}
*/
this.largeX = verts[verts.length - 1].x;
verts.sort(function(a,b){
return a.y - b.y;
});
this.smallY = verts[0].y;
this.largeY = verts[verts.length - 1].y;
var w = this.largeX - this.smallX;
var h = this.largeY - this.smallY;
var x = this.smallX;
var y = this.smallY;
Static.Rectangle.call(this,w,h,x,y);
}
/**
* Get bounding box of PhSim shape.
* @param {PhSimObject} object - The Static Object
* @returns {PhSim.BoundingBox}
*/
BoundingBox.fromShape = function(object) {
if(object.shape === "polygon") {
return new BoundingBox(object.verts);
}
if(object.shape === "regPolygon") {
return new BoundingBox(Vertices.regPolygon(object));
}
if(object.shape === "rectangle") {
return new BoundingBox(Vertices.rectangle(object,true));
}
if(object.shape === "circle") {
var ax = object.x - object.radius;
var ay = object.y - object.radius;
var bx = object.x + object.radius;
var by = object.y + object.radius;
return diagRect(ax,ay,bx,by,0);
}
if(object.composite) {
var a = [];
for(var i = 0; i < object.objUniverse.length; i++) {
a.push( Vertices.rectangle( this.getStaticBoundingBox(object.objUniverse[i]) ) );
}
a = a.flat(Infinity);
return new BoundingBox(a);
}
}
module.exports = BoundingBox;