
本文介绍如何将一个给定坐标的正方形区域,按指定边长均匀划分为多个不重叠的小正方形,并返回其坐标数组;支持边界截断处理,自动忽略无法容纳完整小方块的剩余区域。
本文介绍如何将一个给定坐标的正方形区域,按指定边长均匀划分为多个不重叠的小正方形,并返回其坐标数组;支持边界截断处理,自动忽略无法容纳完整小方块的剩余区域。
在图像处理、网格布局、地理围栏划分或游戏地图分块等场景中,常需将一个大矩形(此处为正方形)区域按固定尺寸切分为若干子区域。假设已知大正方形的左上角坐标 (x1, y1) 和右下角坐标 (x2, y2)(采用笛卡尔平面习惯:x 向右递增,y 向下递增,且坐标为整数),以及目标小正方形的边长 smallerSquareSide,我们的目标是生成所有完全落在大正方形内部、互不重叠、且边与坐标轴对齐的子正方形坐标数组,每个子正方形以 [x1_sub, x2_sub, y1_sub, y2_sub] 格式表示。
实现逻辑非常直观:
- 在 x 方向,从 x1 开始,每次步进 smallerSquareSide,直到右边界 j + smallerSquareSide - 1 超出 x2 为止;
- 在 y 方向同理,从 y1 开始步进,确保 i + smallerSquareSide - 1 ≤ y2;
- 每次内层循环组合即生成一个有效小正方形:[j, j + smallerSquareSide - 1, i, i + smallerSquareSide - 1]。
以下是完整、可直接运行的 PHP 示例代码:
$x1 = 1; $x2 = 100; $y1 = 1; $y2 = 100; $smallerSquareSide = 10; $res = []; for ($i = $y1; $i + $smallerSquareSide - 1 Array ( [0] => 1 [1] => 10 [2] => 1 [3] => 10 ) // [1] => Array ( [0] => 11 [1] => 20 [2] => 1 [3] => 10 ) // [2] => Array ( [0] => 21 [1] => 30 [2] => 1 [3] => 10 ) // [3] => Array ( [0] => 31 [1] => 40 [2] => 1 [3] => 10 ) // [4] => Array ( [0] => 41 [1] => 50 [2] => 1 [3] => 10 ) // )
✅ 关键说明与注意事项:
- 该算法自动处理边界不整除问题:例如若 $x2 = 104,则 x 方向最后只取到 91–100,而 101–104 因不足 10 单位被舍弃;
- 坐标系假设为“左上原点、向右向下增长”,若使用其他约定(如 OpenGL 的 y 向上),仅需调整 y 循环方向(从高到低);
- 若需填充而非截断(即强制覆盖整个区域,允许最后一个小方块拉伸),则需额外逻辑判断并单独处理末尾块;
- 时间复杂度为 O(n²),其中 n 为单边可容纳小方块数量,实际应用中效率极高。
掌握此方法后,你可轻松扩展为矩形分割(分别指定 smallerWidth 和 smallerHeight)、带偏移/间距的网格生成,或结合 GD/ImageMagick 进行图像分块裁剪。










