PHP:查找矩阵表中是否有两个位置冲突
我有一个地图(数组数组),我有位置。每个位置都有起点和终点。每个点都有X和Y 例如:PHP:查找矩阵表中是否有两个位置冲突,php,matrix,Php,Matrix,我有一个地图(数组数组),我有位置。每个位置都有起点和终点。每个点都有X和Y 例如: $map = [ ['0,0', '1,0', '2,0', '3,0', '4,0', '5,0', '6,0', '7,0', '8,0', '9,0'], ['0,1', '1,1', '2,1', '3,1', '4,1', '5,1', '6,1', '7,1', '8,1', '9,1'], ['0,2', '1,2', '2,2', '3,2', '4,2', '5,2',
$map = [
['0,0', '1,0', '2,0', '3,0', '4,0', '5,0', '6,0', '7,0', '8,0', '9,0'],
['0,1', '1,1', '2,1', '3,1', '4,1', '5,1', '6,1', '7,1', '8,1', '9,1'],
['0,2', '1,2', '2,2', '3,2', '4,2', '5,2', '6,2', '7,2', '8,2', '9,2'],
['0,3', '1,3', '2,3', '3,3', '4,3', '5,3', '6,3', '7,3', '8,3', '9,3'],
['0,4', '1,4', '2,4', '3,4', '4,4', '5,4', '6,4', '7,4', '8,4', '9,4'],
];
$location1 = '1,1,3,3';
$location2 = '7,0,9,1';
$location3 = '2,3,5,4';
hasConflict($location1, $location2);// Returns false = no conflict
hasConflict($location1, $location3);// Returns true = there is conflict
我不确定如何构建
hascafflict()
函数。我可以做嵌套循环并选中每个复选框,但我认为可能有一种数学/更快的方法可以做到这一点。ABCD和EFGH这两个区域何时不冲突
(A,B)-----+ (E,F)-----+
| | | |
+------(C,D) +------(G,H)
当第一个比第二个更左时(因此C(D >= F) && (B <= H) && (C >= E) && (A <= G)
(D>=F)和&(B=E)和&(A从另一个角度思考。ABCD和EFGH这两个区域何时不冲突
(A,B)-----+ (E,F)-----+
| | | |
+------(C,D) +------(G,H)
当第一个比第二个更左时(因此CG);当它较低时(因此B>H)
如果它不太左,也不太右,也不太高,也不太低,它必须重叠
在一维中,如果CG,则两个范围(A…C)和(E…G)是不相交的。因此,如果该条件为假,则它们相交,并且((C>=E)&&(A G)为假
C CG为真
A---E---C---G CG是假的
CG是假的
A----E----G----C CG是假的
在二维中,如果X轴和Y轴上都有交点,则区域重叠。因此,冲突的条件是
(D >= F) && (B <= H) && (C >= E) && (A <= G)
(D>=F)和&(B=E)和&(A我喜欢@LSemi的数学解释,它应该被标记为解决方案。但是我已经编写了PHP代码,所以我也发布了它
function hasConflict($location1,$location2){
$location1=explode(',',$location1);
$location2=explode(',',$location2);
if($location1[0]>=$location2[0]&&$location1[0]<=$location2[2]&&$location1[1]>=$location2[1]&&$location1[1]<=$location2[3]) return true;
if($location2[0]>=$location1[0]&&$location2[0]<=$location1[2]&&$location2[1]>=$location1[1]&&$location2[1]<=$location1[3]) return true;
return false;
}
$map = [
['0,0', '1,0', '2,0', '3,0', '4,0', '5,0', '6,0', '7,0', '8,0', '9,0'],
['0,1', '1,1', '2,1', '3,1', '4,1', '5,1', '6,1', '7,1', '8,1', '9,1'],
['0,2', '1,2', '2,2', '3,2', '4,2', '5,2', '6,2', '7,2', '8,2', '9,2'],
['0,3', '1,3', '2,3', '3,3', '4,3', '5,3', '6,3', '7,3', '8,3', '9,3'],
['0,4', '1,4', '2,4', '3,4', '4,4', '5,4', '6,4', '7,4', '8,4', '9,4'],
];
$location1 = '1,1,3,3';
$location2 = '7,0,9,1';
$location3 = '2,3,5,4';
var_dump(hasConflict($location1, $location2));// Returns false = no conflict
var_dump(hasConflict($location1, $location3));// Returns true = there is conflict
函数有冲突($location1,$location2){
$location1=爆炸(“,”,$location1);
$location2=爆炸(“,”,$location2);
如果($location1[0]>=$location2[0]&$location1[0]=$location2[1]&&$location1[1]=$location1[0]&$location2[0]=$location1[1]&&$location2[1]我喜欢@LSemi的数学解释,它应该被标记为解决方案。但是我已经编写了PHP代码,所以我也发布了它
function hasConflict($location1,$location2){
$location1=explode(',',$location1);
$location2=explode(',',$location2);
if($location1[0]>=$location2[0]&&$location1[0]<=$location2[2]&&$location1[1]>=$location2[1]&&$location1[1]<=$location2[3]) return true;
if($location2[0]>=$location1[0]&&$location2[0]<=$location1[2]&&$location2[1]>=$location1[1]&&$location2[1]<=$location1[3]) return true;
return false;
}
$map = [
['0,0', '1,0', '2,0', '3,0', '4,0', '5,0', '6,0', '7,0', '8,0', '9,0'],
['0,1', '1,1', '2,1', '3,1', '4,1', '5,1', '6,1', '7,1', '8,1', '9,1'],
['0,2', '1,2', '2,2', '3,2', '4,2', '5,2', '6,2', '7,2', '8,2', '9,2'],
['0,3', '1,3', '2,3', '3,3', '4,3', '5,3', '6,3', '7,3', '8,3', '9,3'],
['0,4', '1,4', '2,4', '3,4', '4,4', '5,4', '6,4', '7,4', '8,4', '9,4'],
];
$location1 = '1,1,3,3';
$location2 = '7,0,9,1';
$location3 = '2,3,5,4';
var_dump(hasConflict($location1, $location2));// Returns false = no conflict
var_dump(hasConflict($location1, $location3));// Returns true = there is conflict
函数有冲突($location1,$location2){
$location1=爆炸(“,”,$location1);
$location2=爆炸(“,”,$location2);
如果($location1[0]>=$location2[0]&$location1[0]=$location2[1]&&$location1[1]=$location1[0]&&$location2[0]=$location1[1]&$location2[1],那么对于案例“2,0,3,1和1,2,4,2”,您的代码应该返回true
,是吗?你是对的。我忘记了一些条件。编辑。谢谢。对于“2,0,3,1和1,2,4,2”的情况,你的代码应该返回true
,不是吗?你是对的。我忘记了一些条件。编辑。谢谢。