【问题标题】:Php - check if rectangles overlapPhp - 检查矩形是否重叠
【发布时间】:2017-12-01 11:43:16
【问题描述】:

我正在使用下面提到的代码来确定图像地图上的矩形是否相交或重叠,但我得到了错误的结果。 Y 坐标从上到下增加。矩形的尺寸各不相同。

$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
)

【问题讨论】:

  • if 语句似乎从上到下比较了两次,而不是第二次从左到右比较。
  • @MartinCook 请看一看。我现在已经编辑了代码。
  • @cartina 你得到了什么结果,你期待什么结果?根据我的计算,这似乎应该为您的矩形返回 1 - 这是您得到的吗?
  • 在这种情况下,这些矩形应该产生 1 还是 0?
  • @cartina 我想你会感到困惑 - 你是 X2 和 Y2 值实际上是 width 和 height 值,NOT X2和 Y2 坐标

标签: php intersection rectangles


【解决方案1】:

在您的 cmets 和聊天讨论之后,您似乎期望 X2Y2 值是坐标,但您的代码分别将它们视为宽度和高度。

如果您希望代码将它们视为坐标,则您的代码将更改为以下内容:

$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);

请注意,我已更改您声明 $a$b 的代码,以便它直接获取 X2Y2 值,而不是将它们添加到 X1Y1 值中.我还使用了您在问题编辑中添加的矩形,而不是您定义的原始矩形。

【讨论】:

    猜你喜欢
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2019-05-26
    • 2018-09-29
    • 2020-06-19
    相关资源
    最近更新 更多