开发者

Rectangle Auto Blit

I have a container rectangle and element rectangle, both are specified only in height and width. Using PHP I need to figure out what positions and orientation would allow for the most possible blits of the element within the container having absolutely no overlap.

An Exampl开发者_开发百科e :

$container = array(5000,2000);
$element = array(300,200);

The output should be an array of "blit" arrays (or objects) like so

$blit_object = array($x,$y,$rotation_degrees);


Well, since no one is answering me, I am just going to show my "trial and error" solution in case anyone else ever needs it.

It calculates the two basic layout options and sees which one has the most and uses that.

function MakeBlits($container,$element)
{
    $container_x = $container[0];
    $container_y = $container[1];
    $options = array();
    for($i = 0;$i<=1;$i++)
    {
        if($i == 0)
        {
            $element_x = $element[0];
            $element_y = $element[1];
        }
        else


{
        $element_x = $element[1];
        $element_y = $element[0];
    }
    $test_x = floor($container_x/$element_x);
    $test_y = floor($container_y/$element_y);
    $test_remainder_x = $container_x - $test_x*$element_x;
    $test_remainder_y = $container_y - $test_y*$element_y;
    $test_x2 = 0;
    $test_x3 = 0;
    $test_y2 = 0;
    $test_y3 = 0;
    if($test_remainder_x > $element_y)
    {
        $test_x2 = floor($test_remainder_x/$element_y);
        $test_y2 = floor($container_y/$element_x);
    }
    if($test_remainder_y > $element_x)
    {
        $test_x3 = floor($container_x/$element_y);
        $test_y3 = floor($test_remainder_y/$element_x);
    }
    $options[] = array(
        'total'=>($test_x*$test_y)+($test_x2*$test_y2)+($test_x3*$test_y3),
        'x'=>$test_x,
        'y'=>$test_y,
        'x2'=>$test_x2,
        'y2'=>$test_y2,
        'x3'=>$test_x3,
        'y3'=>$test_y3
    );
}
if($options[0]['total']>=$options[1]['total'])
{
    $option = $options[0];
    $rotate = 0;
    $width = $element[0];
    $height = $element[1];

}
else
{
    $option = $options[1];
    $rotate = -90;
    $width = $element[1];
    $height = $element[0];
}
$blit_objects = array();
for($i=0;$i<$option['x'];$i++)
{
    for($j=0;$j<$option['y'];$j++)
    {
        $blit_objects[] = array(
            'x'=>$i*$width,
            'y'=>$j*$height,
            'rotation'=>$rotate);
    }
}
for($k = 0;$k < $option['x2'];$k++)
{
    for($l = 0;$l < $option['y2'];$l++)
    {
        $blit_objects[] = array(
            'x'=>$i*$width + $k*$height,
            'y'=>$l*$width,
            'rotation'=>$rotate+90);
    }
}
for($k = 0;$k < $option['x3'];$k++)
{
    for($l = 0;$l < $option['y3'];$l++)
    {
        $blit_objects[] = array(
            'x'=>$k*$height,
            'y'=>$j*$height+$l*$width,
            'rotation'=>$rotate+90);
    }
}
return $blit_objects;

}

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜