
本文介绍如何将一个给定坐标的较大正方形,按指定边长均匀分割为多个不重叠的小正方形,并返回其坐标数组;支持边界截断处理,自动忽略无法容纳完整小正方形的边缘区域。
本文介绍如何将一个给定坐标的较大正方形,按指定边长均匀分割为多个不重叠的小正方形,并返回其坐标数组;支持边界截断处理,自动忽略无法容纳完整小正方形的边缘区域。
在地理围栏、图像分块、网格化渲染或空间索引等场景中,常需将一个大矩形(此处特指正方形)按固定尺寸切分为若干子正方形。关键在于:确保每个子正方形严格对齐、不越界、边长恒定,且坐标格式统一为 [x1, x2, y1, y2](左上→右下,含端点)。
以下是一个健壮、可复用的 PHP 实现:
$x1 = 1;
$x2 = 100;
$y1 = 1;
$y2 = 100;
$smallerSquareSide = 10;
$res = [];
// 外层循环遍历 y 方向(行)
for ($i = $y1; $i + $smallerSquareSide - 1 <= $y2; $i += $smallerSquareSide) {
// 内层循环遍历 x 方向(列)
for ($j = $x1; $j + $smallerSquareSide - 1 <= $x2; $j += $smallerSquareSide) {
$res[] = [
$j, // 小正方形左边界 x1
$j + $smallerSquareSide - 1, // 小正方形右边界 x2(含)
$i, // 小正方形上边界 y1
$i + $smallerSquareSide - 1 // 小正方形下边界 y2(含)
];
}
}✅ 输出示例(前5项):
[ [1, 10, 1, 10], [11, 20, 1, 10], [21, 30, 1, 10], [31, 40, 1, 10], [41, 50, 1, 10], // … 共 10×10 = 100 个小正方形 ]
⚠️ 注意事项:
- 边界处理:循环条件 <= $y2 和 <= $x2 中的 -1 确保 x2 和 y2 是闭区间端点(即包含该坐标),符合常见二维坐标系习惯;若输入坐标为像素索引(如图像坐标),此设计天然兼容 0-based 或 1-based 场景。
- 空隙容忍:当大正方形边长不能被 smallerSquareSide 整除时(例如 $x2=105),右侧/底部多余区域(如 x=101–105)将被自动跳过,不生成不完整正方形——这是预期行为,避免数据失真。
- 扩展建议:如需保留边缘不完整区域(如生成 10×10 + 10×5 的残缺矩形),可改用 floor(($x2 - $x1 + 1) / $smallerSquareSide) 计算列数,并单独处理余数;但本方案坚持「只返回完整正方形」的设计原则,更适用于栅格化、瓦片服务等标准场景。
该方法时间复杂度为 O(n²),其中 n 为单边可容纳小正方形数量,高效且无依赖,可直接集成至空间计算工具链中。

















