for testing and deploying your application
for finding and fixing issues
for empowering human code reviews
<?php
/**
* Box packing (3D bin packing, knapsack problem).
*
* @author Doug Wright
*/
declare(strict_types=1);
namespace DVDoug\BoxPacker;
use function usort;
* Applies load stability to generated result.
* @internal
class LayerStabiliser
{
* @param PackedLayer[] $packedLayers
* @return PackedLayer[]
public function stabilise(array $packedLayers): array
// first re-order according to footprint
$stabilisedLayers = [];
usort($packedLayers, $this->compare(...));
// then for each item in the layer, re-calculate each item's z position
$currentZ = 0;
foreach ($packedLayers as $oldZLayer) {
$oldZStart = $oldZLayer->getStartZ();
$newZLayer = new PackedLayer();
foreach ($oldZLayer->getItems() as $oldZItem) {
$newZ = $oldZItem->z - $oldZStart + $currentZ;
$newZItem = new PackedItem($oldZItem->item, $oldZItem->x, $oldZItem->y, $newZ, $oldZItem->width, $oldZItem->length, $oldZItem->depth);
$newZLayer->insert($newZItem);
}
$stabilisedLayers[] = $newZLayer;
$currentZ += $newZLayer->getDepth();
return $stabilisedLayers;
private function compare(PackedLayer $layerA, PackedLayer $layerB): int
compare()
This check looks for private methods that have been defined, but are not used inside the class.
return ($layerB->getFootprint() <=> $layerA->getFootprint()) ?: ($layerB->getDepth() <=> $layerA->getDepth());
This check looks for private methods that have been defined, but are not used inside the class.