2011-09-25 55 views
0

我有一個容器矩形和元素矩形,都只在高度和寬度指定。使用PHP我需要弄清楚什麼位置和方向將允許容器中的元素的最可能的位置完全沒有重疊。矩形自動Blit

爲例:

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

輸出應爲「blit的」陣列(或對象)的,像這樣

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

我沒有注意到的 「功課」 指出。我忽略了它嗎? –

+0

哈哈....不,這是我寫的一個程序。我有一個非常難看的嘗試和錯誤的方式,但我認爲必須有更清晰的方法。 – trex005

回答

0

井的陣列,因爲沒有人回答我,我剛將展示我的「試錯」解決方案,以防其他人需要它。

它計算兩個基本佈局選項,並查看哪一個選項最有用並使用它。

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; 

}