2017-12-01 2 views
0

아래의 코드를 사용하여 이미지 맵상의 직사각형이 교차하는지 또는 겹치는지를 확인하지만 잘못된 결과가 나타납니다. Y 좌표는 위에서 아래로 증가합니다. 직사각형의 크기는 다양합니다.PHP - 직사각형이 겹치는 지 확인하십시오.

$r1 = array('MapX1' => 10, 'MapX2' => 10, 'MapY1' => 30, 'MapY2' => 30); 
$r2 = array('MapX1' => 20, 'MapX2' => 20, 'MapY1' => 50, 'MapY2' => 50); 

function intersectRect($r1, $r2) { 
     /* 
     left: x1, 
     right: x1 + x2, 
     top: y1, 
     bottom: y1 + y2, 
     */ 

$r1['MapX2'] = $r1['MapX2'] - $r1['MapX1']; 
$r2['MapX2'] = $r2['MapX2'] - $r2['MapX1']; 

$r1['MapY1'] = $r1['MapY2'] - $r1['MapY1']; 
$r2['MapY2'] = $r1['MapY2'] - $r1['MapY1']; 

     $a = array('left' => $r1['MapX1'], 'right' => $r1['MapX1'] + $r1['MapX2'], 'top' => $r1['MapY1'], 
      'bottom' => $r1['MapY1'] + $r1['MapY2']); 
     $b = array('left' => $r2['MapX1'], 'right' => $r2['MapX1'] + $r2['MapX2'], 'top' => $r2['MapY1'], 
      'bottom' => $r2['MapY1'] + $r2['MapY2']); 
     if(
      $a['right'] < $b['left'] || 
      $a['left'] > $b['right'] || 
      $a['bottom'] < $b['top'] || 
      $a['top'] > $b['bottom'] 
     ){ 
      return 0; 
    } 
    else{ 
     return 1; 
    } 
} 

echo intersectRect($r1, $r2); 

내가 여기서 잘못하고있는 것을 알아내는 데 도움이 될까요?

위의 코드는 아래 사각형에 대한 올바른 작동하지 않습니다 1 부여하지만 여러분의 의견과 채팅에 대한 토론 후 0

$r1 = array(
    [MapX1] => 536 
    [MapX2] => 567 
    [MapY1] => 199 
    [MapY2] => 237 
) 
$r2 = array 
(
    [MapX1] => 430 
    [MapX2] => 453 
    [MapY1] => 141 
    [MapY2] => 153 
) 
+1

if 문은 왼쪽에서 오른쪽으로 두 번째 비교하는 대신 위에서 아래로 두 번 비교하는 것처럼 보입니다. –

+0

@MartinCook보세요. 지금 코드를 편집했습니다. – cartina

+0

@cartina 어떤 결과를 얻고 있으며 어떤 결과를 기대합니까? 내 계산에서 볼 때, 이것은 사각형에 1을 반환해야하는 것으로 보입니다. – crazyloonybin

답변

0

를 반환해야합니다, 당신이 X2Y2를 기대하고 있다는 표시 값은 좌표가되지만 코드는 너비와 높이로 처리합니다.

당신은 좌표 대신, 코드는 다음과 같이 변경하는 것처럼 코드를 치료하려면 : 당신은 그래서 $a$b를 선언하는 내가 코드를 변경

$r1 = array('MapX1' => 536, 'MapX2' => 567, 'MapY1' => 199, 'MapY2' => 237); 
$r2 = array('MapX1' => 430, 'MapX2' => 453, 'MapY1' => 141, 'MapY2' => 153); 

function intersectRect($r1, $r2) { 
    /* 
    left: x1, 
    right: x2, 
    top: y1, 
    bottom: y2, 
    */ 

    $a = array('left' => $r1['MapX1'], 'right' => $r1['MapX2'], 'top' => $r1['MapY1'], 
     'bottom' => $r1['MapY2']); 
    $b = array('left' => $r2['MapX1'], 'right' => $r2['MapX2'], 'top' => $r2['MapY1'], 
     'bottom' => $r2['MapY2']); 
    if(
     $a['right'] < $b['left'] || 
     $a['left'] > $b['right'] || 
     $a['bottom'] < $b['top'] || 
     $a['top'] > $b['bottom'] 
    ){ 
     return 0; 
    } else { 
     return 1; 
    } 
} 

echo intersectRect($r1, $r2); 

X1Y1 값에 추가하는 대신 X2Y2 값을 직접 가져옵니다. 또한 내가 정의한 원래의 사각형 대신 질문에 편집에 추가 한 사각형을 사용했습니다.

관련 문제