在图形处理、游戏地图生成、前端网格布局等开发场景中,我们经常需要将一个大的正方形区域,按照固定边长拆分成多个相邻的小正方形,最终得到这些小正方形的位置与尺寸信息组成的数组。这个需求的核心是要先确认大正方形能否被小正方形完整划分,再计算每一个小正方形的起始坐标和尺寸参数。

核心判断逻辑
在开始提取之前,首先需要确认大正方形可以被固定边长的小正方形完整覆盖,避免出现尺寸不匹配的情况。假设大正方形的边长为big_side,小正方形的边长为small_side,需要满足以下条件:
- 大正方形边长必须大于等于小正方形边长,否则无法提取出有效的小正方形
- 大正方形边长必须能被小正方形边长整除,即
big_side % small_side == 0,保证没有剩余区域
当满足上述条件时,每一行和每一列可以放置的小正方形数量为count = big_side / small_side,总小正方形数量为count * count。
小正方形坐标计算规则
我们以大正方形的左上角作为坐标原点(0,0),x轴向右延伸,y轴向下延伸,那么第i行第j列的小正方形(行和列均从0开始计数)的起始坐标计算方式为:
- 起始x坐标:
j * small_side - 起始y坐标:
i * small_side - 小正方形边长固定为
small_side
Python实现示例
以下是一个完整的Python实现,返回所有小正方形的坐标和尺寸信息数组:
def extract_small_squares(big_side, small_side):
# 校验参数合法性
if big_side < small_side:
raise ValueError("大正方形边长不能小于小正方形边长")
if big_side % small_side != 0:
raise ValueError("大正方形边长必须能被小正方形边长整除")
# 计算每行每列的小正方形数量
count = big_side // small_side
result = []
# 遍历生成所有小正方形信息
for i in range(count):
for j in range(count):
square_info = {
"x": j * small_side,
"y": i * small_side,
"side": small_side
}
result.append(square_info)
return result
# 测试示例:大正方形边长100,小正方形边长20
if __name__ == "__main__":
big_side = 100
small_side = 20
squares = extract_small_squares(big_side, small_side)
print(f"共提取到{len(squares)}个小正方形")
# 打印前两个小正方形信息
for idx, square in enumerate(squares[:2]):
print(f"第{idx+1}个小正方形:x={square['x']}, y={square['y']}, 边长={square['side']}")
JavaScript实现示例
前端场景下可以使用JavaScript实现相同的逻辑,返回一个包含小正方形信息的对象数组:
function extractSmallSquares(bigSide, smallSide) {
// 参数校验
if (bigSide < smallSide) {
throw new Error("大正方形边长不能小于小正方形边长");
}
if (bigSide % smallSide !== 0) {
throw new Error("大正方形边长必须能被小正方形边长整除");
}
// 计算数量
const count = Math.floor(bigSide / smallSide);
const result = [];
// 遍历生成数组
for (let i = 0; i < count; i++) {
for (let j = 0; j < count; j++) {
result.push({
x: j * smallSide,
y: i * smallSide,
side: smallSide
});
}
}
return result;
}
// 测试示例
const bigSide = 100;
const smallSide = 20;
try {
const squares = extractSmallSquares(bigSide, smallSide);
console.log(`共提取到${squares.length}个小正方形`);
console.log("第一个小正方形信息:", squares[0]);
} catch (e) {
console.error(e.message);
}
边界情况说明
如果实际场景中允许存在不足固定边长的剩余区域,可以调整逻辑,将最后一列或最后一行的剩余区域也作为一个小正方形,此时不需要强制要求大正方形边长能被小正方形边长整除。只需将循环条件改为while (current_x < big_side),每次计算当前小正方形的实际边长为min(small_side, big_side - current_x)即可,不过这种情况生成的小正方形边长可能不完全一致。