Php - 检查矩形是否重叠
Php - check if rectangles overlap
我正在使用下面提到的代码来确定图像地图上的矩形是否相交或重叠,但我得到了错误的结果。 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 但应该 return 0.
$r1 = array(
[MapX1] => 536
[MapX2] => 567
[MapY1] => 199
[MapY2] => 237
)
$r2 = array
(
[MapX1] => 430
[MapX2] => 453
[MapY1] => 141
[MapY2] => 153
)
在您的聊天评论和讨论之后,您似乎希望 X2
和 Y2
值是坐标,但您的代码将它们分别视为宽度和高度.
如果您希望代码将它们视为坐标,您的代码将更改为以下内容:
$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
的代码,以便它直接获取 X2
和 Y2
值,而不是添加它们X1
和 Y1
值。我还使用了您在问题编辑中添加的矩形,而不是您定义的原始矩形。
我正在使用下面提到的代码来确定图像地图上的矩形是否相交或重叠,但我得到了错误的结果。 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 但应该 return 0.
$r1 = array(
[MapX1] => 536
[MapX2] => 567
[MapY1] => 199
[MapY2] => 237
)
$r2 = array
(
[MapX1] => 430
[MapX2] => 453
[MapY1] => 141
[MapY2] => 153
)
在您的聊天评论和讨论之后,您似乎希望 X2
和 Y2
值是坐标,但您的代码将它们分别视为宽度和高度.
如果您希望代码将它们视为坐标,您的代码将更改为以下内容:
$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
的代码,以便它直接获取 X2
和 Y2
值,而不是添加它们X1
和 Y1
值。我还使用了您在问题编辑中添加的矩形,而不是您定义的原始矩形。