PHP计算多个二维对象的边界框
我在二维场上有几个对象: 当按编程方式分组时,我需要计算项目的大小: 我有每个物体的大小,位置和旋转弧度 有人知道这个术语或方法吗 我需要用PHP来做 更新一些代码:PHP计算多个二维对象的边界框,php,2d,bounding-box,Php,2d,Bounding Box,我在二维场上有几个对象: 当按编程方式分组时,我需要计算项目的大小: 我有每个物体的大小,位置和旋转弧度 有人知道这个术语或方法吗 我需要用PHP来做 更新一些代码: class Layer { /** * @var float The X position */ public $x; /** * @var float The Y position */ public $y; /** * @var fl
class Layer {
/**
* @var float The X position
*/
public $x;
/**
* @var float The Y position
*/
public $y;
/**
* @var float The width of the rectanlge
*/
public $width;
/**
*
* @var float The height of the rectangle
*/
public $height;
/**
*
* @var float The rotation in radians
*/
public $rotation;
}
我现在需要一种通过$layers循环计算边界框的方法。我认为这是正确的计算:
$layers = array();
$layers[0] = new Layer();
$layers[0]->x = 10;
$layers[0]->y = 10;
$layers[0]->width = 100;
$layers[0]->height = 200;
$layers[0]->rotation = 0.3;
$layers[1] = new Layer();
$layers[1]->x = 50;
$layers[1]->y = 60;
$layers[1]->width = 200;
$layers[1]->height = 300;
$layers[1]->rotation = 0.1;
$layers[2] = new Layer();
$layers[2]->x = 100;
$layers[2]->y = 300;
$layers[2]->width = 200;
$layers[2]->height = 150;
$layers[2]->rotation = 0.3;
print_r($layers);
$boundingBoxes = array();
foreach($layers as $layerKey => $layer) {
$intWidthRotated = $layer->height * abs( sin( $layer->rotation) ) + $layer->width * abs( cos( $layer->rotation ) );
$intHeightRotated = $layer->height * abs( cos( $layer->rotation ) ) + $layer->width * abs( sin( $layer->rotation ) );
$boundingBoxes[$layerKey] = array( $intWidthRotated, $intHeightRotated );
}
print_r($boundingBoxes);
$boundingBox = array();
$minX = null;
$maxX = null;
$minY = null;
$maxY = null;
foreach($layers as $layerKey => $layer) {
$minX = $minX == null ? $layer->x : $minX >= $layer->x ? $layer->x : $minX;
$maxX = $maxX == null ? $layer->x + $boundingBoxes[$layerKey][0] : $maxX <= $layer->x + $boundingBoxes[$layerKey][0] ? $layer->x + $boundingBoxes[$layerKey][0] : $maxX;
$minY = $minY == null ? $layer->y : $minY >= $layer->y ? $layer->y : $minY;
$maxY = $maxY == null ? $layer->y + $boundingBoxes[$layerKey][1] : $maxY <= $layer->y + $boundingBoxes[$layerKey][1] ? $layer->y + $boundingBoxes[$layerKey][1] : $maxY;
}
$boundingBox = array(
'x' => $minX,
'y' => $minY,
'width' => $maxX,
'height' => $maxY
);
print_r($boundingBox);
$layers=array();
$layers[0]=新层();
$layers[0]>x=10;
$layers[0]>y=10;
$layers[0]->宽度=100;
$layers[0]->高度=200;
$layers[0]->旋转=0.3;
$layers[1]=新层();
$layers[1]>x=50;
$layers[1]>y=60;
$layers[1]->宽度=200;
$layers[1]->高度=300;
$layers[1]->旋转=0.1;
$layers[2]=新层();
$layers[2]>x=100;
$layers[2]>y=300;
$layers[2]->宽度=200;
$layers[2]>高度=150;
$layers[2]>旋转=0.3;
打印(层);
$boundingbox=array();
foreach($layerKey=>$layer的图层){
$intWidthRotated=$layer->height*abs(sin($layer->rotation))+$layer->width*abs(cos($layer->rotation));
$intHeightRotated=$layer->height*abs(cos($layer->rotation))+$layer->width*abs(sin($layer->rotation));
$BoundingBox[$layerKey]=数组($intWidthRotated,$InRightRotated);
}
打印(边框);
$boundingBox=array();
$minX=null;
$maxX=null;
$minY=null;
$maxY=null;
foreach($layerKey=>$layer的图层){
$minX=$minX==null?$layer->x:$minX>=$layer->x?$layer->x:$minX;
$maxX=$maxX==null?$layer->x+$boundingbox[$layerKey][0]:$maxX x+$boundingbox[$layerKey][0]?$layer->x+$boundingbox[$layerKey][0]:$maxX;
$minY=$minY==null?$layer->y:$minY>=$layer->y?$layer->y:$minY;
$maxY=$maxY==null?$layer->y+$boundingBoxes[$layerKey][1]:$maxY+$boundingBoxes[$layerKey][1]?$layer->y+$boundingBoxes[$layerKey][1]:$maxY;
}
$boundingBox=数组(
'x'=>$minX,
“y”=>minY美元,
“宽度”=>$maxX,
“高度”=>$maxY
);
打印(边框);
你能添加一些代码来显示你使用什么样的数据结构来存储各种对象数据吗?计算每个顶点的位置,然后计算出X和Y坐标的最小/最大值-吊杆,边界框。好的,编辑我的问题。我发现这篇文章计算了带旋转的单个矩形的边界框:
$layers = array();
$layers[0] = new Layer();
$layers[0]->x = 10;
$layers[0]->y = 10;
$layers[0]->width = 100;
$layers[0]->height = 200;
$layers[0]->rotation = 0.3;
$layers[1] = new Layer();
$layers[1]->x = 50;
$layers[1]->y = 60;
$layers[1]->width = 200;
$layers[1]->height = 300;
$layers[1]->rotation = 0.1;
$layers[2] = new Layer();
$layers[2]->x = 100;
$layers[2]->y = 300;
$layers[2]->width = 200;
$layers[2]->height = 150;
$layers[2]->rotation = 0.3;
print_r($layers);
$boundingBoxes = array();
foreach($layers as $layerKey => $layer) {
$intWidthRotated = $layer->height * abs( sin( $layer->rotation) ) + $layer->width * abs( cos( $layer->rotation ) );
$intHeightRotated = $layer->height * abs( cos( $layer->rotation ) ) + $layer->width * abs( sin( $layer->rotation ) );
$boundingBoxes[$layerKey] = array( $intWidthRotated, $intHeightRotated );
}
print_r($boundingBoxes);
$boundingBox = array();
$minX = null;
$maxX = null;
$minY = null;
$maxY = null;
foreach($layers as $layerKey => $layer) {
$minX = $minX == null ? $layer->x : $minX >= $layer->x ? $layer->x : $minX;
$maxX = $maxX == null ? $layer->x + $boundingBoxes[$layerKey][0] : $maxX <= $layer->x + $boundingBoxes[$layerKey][0] ? $layer->x + $boundingBoxes[$layerKey][0] : $maxX;
$minY = $minY == null ? $layer->y : $minY >= $layer->y ? $layer->y : $minY;
$maxY = $maxY == null ? $layer->y + $boundingBoxes[$layerKey][1] : $maxY <= $layer->y + $boundingBoxes[$layerKey][1] ? $layer->y + $boundingBoxes[$layerKey][1] : $maxY;
}
$boundingBox = array(
'x' => $minX,
'y' => $minY,
'width' => $maxX,
'height' => $maxY
);
print_r($boundingBox);