如何判断两个矩形相交?

in PHP算法 with 0 comment

前几天遇到了一个业务,用户在前台选择矩形并提交给后端,后端要对提交过来的域进行判断是否有其他用户已经勾选。如果是你,你会如何处理?

我选择的一种解决方式是分别计算出两个矩形在同一轴上的距离乘以2,与二者在此轴上高度之和进行比较,前者大说明不相交。其实这么验证的原理也很简单,我们可以假设两个矩形刚好点相交的情况,正如下面优雅的小图所示

企业微信截图_044d8547-bb78-4727-9231-c7611a4d5038.png

我们不难发现,当两个点相交时,二者的距离刚好是相等的,一旦当右上角的矩形再向上移动一点,那么二者的中心距离势必会大于二者的高度之和,所以这个公式从理论上讲是可行的,当然,经过我在项目中的检测也确实如此。

为方便演示,我给八个点分别加上了坐标(将就一下...)

企业微信截图_08b98cc2-5b99-4d06-b0f1-554501d1c7f4.png

具体代码如下所示:


function checkCross(...){
    //A中心点的坐标
    $boxAWidth = $bX - $aX;
    $boxAHeight = $bY - $dY;
    $centerA = ['x' => $boxAWidth / 2 + $aX , 'y' => $boxAHeight / 2 + $dY];
    //B中心点的坐标
    $boxBWidth = $fX - $eX;
    $boxBHeight = $fY - $hY;
    $centerB = ['x' => $boxBWidth / 2 + $eX , 'y' => $boxBHeight / 2 + $hY];

    return ($centerB['y'] - $centerA['y']) >=  ($boxAWidth + $boxBWidth) / 2 
         || ($centerB['x'] - $centerA['x']) >=  ($boxAHeight + $boxBHeight) / 2
}

注:代码不一定能直接运行,主要想要说明的是一个思路。

Responses