商城首页欢迎来到中国正版软件门户

您的位置:首页 >如何从大正方形提取固定小正方形

如何从大正方形提取固定小正方形

  发布于2026-04-20 阅读(0)

扫一扫,手机访问

如何从大正方形中提取固定尺寸的小正方形数组

本文介绍如何将一个给定坐标的较大正方形,按指定边长均匀划分为多个不重叠的小正方形,并返回其坐标数组;支持边界截断处理,自动忽略超出原区域的部分。

本文介绍如何将一个给定坐标的较大正方形,按指定边长均匀划分为多个不重叠的小正方形,并返回其坐标数组;支持边界截断处理,自动忽略超出原区域的部分。

在图像处理、网格布局、地图瓦片生成或游戏开发等场景中,常需将一个二维区域(如大正方形)按固定尺寸切分为若干个规则子区域(小正方形)。关键在于:确保每个小正方形完全落在原始区域内,且彼此无重叠、无缝隙(除可能存在的右/下边界余量外)

给定大正方形的左上角坐标 (x1, y1) 和右下角坐标 (x2, y2)(注意:此处采用常规笛卡尔坐标系理解,即 x 向右递增、y 向下递增,且坐标为整数点),以及目标小正方形边长 $smallerSquareSide,我们可通过双重嵌套循环实现高效划分:

  • 外层循环沿 y 轴方向,起始为 y1,每次步进 $smallerSquareSide,终止条件为 i + $smallerSquareSide - 1 <= $y2(确保小正方形底部不超过 $y2);
  • 内层循环沿 x 轴方向,起始为 x1,步进同上,终止条件为 j + $smallerSquareSide - 1 <= $x2(确保小正方形右侧不超过 $x2);
  • 每次迭代生成一个小正方形坐标四元组 [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 <= $y2; $i += $smallerSquareSide) {
    for ($j = $x1; $j + $smallerSquareSide - 1 <= $x2; $j += $smallerSquareSide) {
        $res[] = [$j, $j + $smallerSquareSide - 1, $i, $i + $smallerSquareSide - 1];
    }
}

// 输出前5个示例(验证格式)
print_r(array_slice($res, 0, 5));
// 输出示例:
// Array (
//   [0] => 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 <= $x2 且 $y1 <= $y2,否则循环不会执行(结果为空数组);建议前置校验。
  • 若原始区域尺寸不能被 $smallerSquareSide 整除(如 $x2 - $x1 + 1 = 103),右侧和/或底部将自然留白——这是预期行为,无需额外填充。
  • 如需支持浮点坐标或中心对齐等高级策略,应改用基于矩形中心或范围映射的算法,而非简单步进。
  • 性能方面,该算法时间复杂度为 O(n),n 为输出小正方形总数,空间复杂度亦为 O(n),适用于万级以内分割场景。

掌握此方法后,你可轻松扩展至矩形区域划分、带偏移量的滑动窗口采样,甚至结合 GD 或 Imagick 实现图像分块导出。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注