
本文介绍如何将一个给定坐标的较大正方形,按指定边长均匀划分为多个不重叠的小正方形,并返回其坐标数组;支持边界截断处理,自动忽略超出原区域的部分。
本文介绍如何将一个给定坐标的较大正方形,按指定边长均匀划分为多个不重叠的小正方形,并返回其坐标数组;支持边界截断处理,自动忽略超出原区域的部分。
在图像处理、网格布局、地图瓦片生成或游戏开发等场景中,常需将一个二维区域(如大正方形)按固定尺寸切分为若干个规则子区域(小正方形)。关键在于:确保每个小正方形完全落在原始区域内,且彼此无重叠、无缝隙(除可能存在的右/下边界余量外)。
给定大正方形的左上角坐标 (x1, y1) 和右下角坐标 (x2, y2)(注意:此处采用常规笛卡尔坐标系理解,即 x 向右递增、y 向下递增,且坐标为整数点),以及目标小正方形边长 $smallerSquareSide,我们可通过双重嵌套循环实现高效划分:
- 外层循环沿 y 轴方向,起始为 y1,每次步进 $smallerSquareSide,终止条件为 i + $smallerSquareSide - 1
- 内层循环沿 x 轴方向,起始为 x1,步进同上,终止条件为 j + $smallerSquareSide - 1
- 每次迭代生成一个小正方形坐标四元组 [x1', x2', y1', y2'],其中:
- x1' = j
- x2' = j + $smallerSquareSide - 1
- y1' = i
- y2' = 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 ) // )
✅ 注意事项与最佳实践:
- 坐标范围必须满足 $x1
- 若原始区域尺寸不能被 $smallerSquareSide 整除(如 $x2 - $x1 + 1 = 103),右侧和/或底部将自然留白——这是预期行为,无需额外填充。
- 如需支持浮点坐标或中心对齐等高级策略,应改用基于矩形中心或范围映射的算法,而非简单步进。
- 性能方面,该算法时间复杂度为 O(n),n 为输出小正方形总数,空间复杂度亦为 O(n),适用于万级以内分割场景。
掌握此方法后,你可轻松扩展至矩形区域划分、带偏移量的滑动窗口采样,甚至结合 GD 或 Imagick 实现图像分块导出。










