2013-05-31 2 views
0

는 내가 해결하기 위해 비교적 간단 믿는 뭔가 완전히 붙어있어 수학 오프셋 : 나는 (GD를 사용하여) 이미지의 상단에 채워진 사각형 그리기 오전 PHP에서PHP GD 기본 사각형

- 나는 작은을 원한다 (각각의 상자마다 갭이 동일합니다.) - 행 (예 : 최대 열)에 최대 직사각형을 칠 때까지 반복합니다. 수평 간격 오프셋하지만 내 삶의 수직 간격 수학을 해결할 수 없습니다. 여기

는 내 코드는 불쾌한 전체의이다 : http://pastebin.com/MHUqi0tG

그러나 특히 PHP는 사각형하기 위해 좌표의 두 세트를 허용 - 오른쪽 하단의 왼쪽 상단 (x와 y)와이 (x의 두 및 y). 여기

특히이 내 코드입니다 :

 $left_wall_of_box_x = ($current_col * $box_size) + $origin_x ; 


     if($last_block_x != $origin_x){ 

      $left_wall_of_box_x = $last_block_x + $gap; 

     } 

     /*verticals coord 1*/ 
     $left_wall_of_box_y = ($current_row * $box_size) + $origin_y; 




     $right_wall_x = $left_wall_of_box_x + $box_size ; 
     $right_wall_y = $left_wall_of_box_y + $box_size; 





     imagefilledrectangle($im, $left_wall_of_box_x, $left_wall_of_box_y, $right_wall_x, $right_wall_y, $red); 

$ 격차 = 2; $ origin_x & origin_y = 상자를 그리기 시작하는 곳입니다.

출력은 현재 수평축에서 잘 분리되어 있지만 수직으로 서로 충돌하거나 병합됩니다.

도움이 분명히 크게 도움 -이 머리카락을 밖으로 찢어. 감사합니다.

답변

1

을 실수가 여기에 있습니다 :

$left_wall_of_box_y = ($current_row * $box_size) + $origin_y; 

은 다음과 같아야합니다

$left_wall_of_box_y = ($current_row * ($box_size + $gap_vertical)) + $origin_y; 

그러나 코드가 깨지기 쉽고 읽기가 어렵습니다. 계산이 복잡해지면서 변수가 더 많아 질수록 변수가 더 커지기 때문에 오류를 발견하지 못하는 이유 중 하나입니다.

그래서, 오히려이 일을보다 :

while($x <= $total_boxes_to_draw) 
{       
    if($current_col >= $cols) 
    { 
    //reset to start of row 
    } 
} 

이 같은 코드를 작성합니다.

기록을 위해
$finished = false; 

for ($y=0; ($y<$rows) && ($finished==false) ; $y++) 
{ 
    $yPosition = $origin_y + $y * ($box_size + $spacing_vertical); 
    for ($x=0 ; $x<$cols && ($finished==false) ; $x++) 
    { 
     $xPosition = $origin_x + $x * ($box_size + $spacing_horizontal); 

     //draw box at $xPosition, $yPosition 

     $boxesDrawn++; 
     if ($boxesDrawn >= $total_boxes_to_draw){ 
      $finished = true; 
     } 
    } 
} 
+0

지저분한 코드에 대한 완벽하고 좋은 점 - 나는 그것이 전혀 도움이되지 않는다고 생각합니다! – Paul

1

가로로 간격을 추가하고 있지만 세로로 추가해야합니다.

간단한 수정은 사각형의 높이에서의 격차를 빼서 당신은 입력 :

imagefilledrectangle($im, $left_wall_of_box_x, $left_wall_of_box_y, 
        $right_wall_x, $right_wall_y - gap, $red); 
+0

-이 완벽하게 작동하지만, 내가 그 일을했다 얼마나 심하게 잘못 강조했기 때문에 나는 다른 대답을 선호 - 감사 어쨌든 – Paul

+0

사실, 잘 구조화 된 코드를 발견하고 해결하는 쉬운 오류가 있습니다. – Joni