PHP&几何 - 如何优雅地计算常见的面向对象(长度/宽度/高度)?

时间:2015-12-14 00:36:14

标签: php mysql arrays object geometry

我试图让PHP调整一些数组值,以便在通过该功能传递的对象的所有实例中,它将比较这些数组值的长度和高度,并尽可能地对齐它们。

想象一下,3个香烟盒。它们的大小,形状和体积完全相同,但是一个是站立的,一个是平躺的,另一个是短的。

然后,想象一下第四个香烟盒。它与其他数据包的长度和宽度相同,但它在容器内有更多的香烟包,因此使其高度(或宽度/长度取决于用户输入)与其他包。

该函数仍应尝试将数据包定位到数组中的原始数据包中。

Visual Example

香烟纸盒的例子不是真正的应用。我有一堆盒子需要分成常见的排列,以便它们可以堆叠。它应足够智能,以便在至少2次测量中计算或忽略与相似尺寸的物体相关的任何其他形状。如果所有3个大小相同但方向不同,则应在适用的地方对其进行纠正,或者如果无法比拟则将其从循环中解脱出来。

我已经模拟了一些示例PHP代码,它应该提供一些好的测试用例和预期的结果。

任何帮助都非常受欢迎,我已经尝试了很多array_diffs和array_intersects的组合,但似乎在所有场景的1个解决方案上都很短暂。

更新

我想我开始认识到有3类计算。实施后,他们可能会被重构。

如果你考虑第一个不会被旋转的对象,那么它有三种可能性,我可能需要为每个对象编写单独的逻辑来应用它下面的每个循环。案例1和案例2的逻辑可能有些相似......

  1. AxBxC所有不同尺寸,比较
  2. AxBxB 2类似尺寸,比较
  3. AxAxA ALL ALLE SIZES,NO ROTATION
  4. 所以它至少消除了一些因素......仍在努力......

    <?php
    
    $params['object'] = array();
    /* START TEST 1 */
    $params['object'][] = array(    'height'=>'30',
                                    'width'=>'10',
                                    'length'=>'20');
    $params['object'][] = array(    'height'=>'20',
                                    'width'=>'30',
                                    'length'=>'30');
    /* END TEST 1 */
    /* START TEST 2 
    $params['object'][] = array(    'height'=>'30',
                                    'width'=>'30',
                                    'length'=>'20');
    $params['object'][] = array(    'height'=>'30',
                                    'width'=>'20',
                                    'length'=>'30');
    /* END TEST 2 */
    /* START TEST 3 
    $params['object'][] = array(    'height'=>'30',
                                    'width'=>'16',
                                    'length'=>'14');
    $params['object'][] = array(    'height'=>'30',
                                    'width'=>'20',
                                    'length'=>'30');
    /* END TEST 3 */
    
    echo '<PRE>';
    echo 'INPUT<BR>';
    print_r($params['object']);
    
    //Check for common orientations
    /* PLEASE KEEP BETWEEN HERE --- */
    $rotated = array();
    foreach($params['object'] as $on=>$outer){
        if(in_array($on,$rotated)){ continue; }
        $rotated[$on] = $on;
        if($oo['width']==$oo['length'] && $oo['length']==$oo['height']){ continue; }
        $oo = array('width'=>$outer['width'],
                    'length'=>$outer['length'],
                    'height'=>$outer['height']);
        foreach($params['object'] as $in=>$inner){
            if(in_array($in,$rotated)){ continue; }
            if($in==$on){ continue; }
            $ii = array('width'=>$inner['width'],
                        'length'=>$inner['length'],
                        'height'=>$inner['height']);
            /* --- TO HERE */
    
            //DETERMINE HOW TO ROTATE THESE???
            //IF ROTATED, MARK AS ROTATED[$in] TO PREVENT FURTHER ROTATIONS TO OCCUR TO THIS ITEM
    
            $rotated[$in] = $in;
        }
    }
    
    echo 'OUTPUT<BR>';
    print_r($params['object']);
    
    /* TEST 1 OUTPUT SHOULD BE - ALIGNED SAME ORIENTATION, BUT EACH OBJ IS DIF WIDTH
    - same logic should work if any of the H/W/L are in different orders but values consistant in any 2 pairs
    Array
    (
        [0] => Array
            (
                [height] => 30
                [width] => 10
                [length] => 20
            )
    
        [1] => Array
            (
                [height] => 30
                [width] => 30
                [length] => 20
            )
    
    )
    */
    /* TEST 2 OUTPUT SHOULD BE - SAME VALUES, SO ALIGN COMPLETELY
    - same logic should work if any of the H/W/L are in different orders
    Array
    (
        [0] => Array
            (
                [height] => 30
                [width] => 30
                [length] => 20
            )
    
        [1] => Array
            (
                [height] => 30
                [width] => 30
                [length] => 20
            )
    
    )
    */
    /* TEST 3 OUTPUT SHOULD BE - NO CHANGE BECAUSE LESS THAN 2 COMPATIBLE MEASUREMENTS, NO ADD TO $rotation[$in]
    Array
    (
        [0] => Array
            (
                [height] => 30
                [width] => 16
                [length] => 14
            )
    
        [1] => Array
            (
                [height] => 30
                [width] => 20
                [length] => 30
            )
    
    )
    */
    
    ?>
    

0 个答案:

没有答案