![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/dvdoug/boxpacker/src/ |
<?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->getZ() - $oldZStart + $currentZ; $newZItem = new PackedItem($oldZItem->getItem(), $oldZItem->getX(), $oldZItem->getY(), $newZ, $oldZItem->getWidth(), $oldZItem->getLength(), $oldZItem->getDepth()); $newZLayer->insert($newZItem); } $stabilisedLayers[] = $newZLayer; $currentZ += $newZLayer->getDepth(); } return $stabilisedLayers; } private function compare(PackedLayer $layerA, PackedLayer $layerB): int { return ($layerB->getFootprint() <=> $layerA->getFootprint()) ?: ($layerB->getDepth() <=> $layerA->getDepth()); } }