You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归土地细分算法中颜色层级逻辑的实现(Python)

土地地块递归细分与颜色层级实现方案

1. 子地块细分顺序判定与层级颜色分配

  • 细分顺序判定:将递归深度作为层级标识,初始地块为层级0,每完成一次细分,子地块层级为父层级+1。细分时固定遵循左上→右上→左下→右下的顺序,递归调用时严格按此逻辑处理子地块,确保每个子地块的细分顺序可追溯。
  • 颜色层级分配:预定义与层级对应的RGB颜色列表(无需第三方库),通过层级索引直接取色,保证不同层级颜色区分度。例如:
    # 层级0到4的颜色,可按需扩展
    COLORS = [(0, 0, 0), (255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0)]
    

2. 按细分逆序呈现颜色层级

细分过程是父地块→子地块的自上而下顺序,要实现逆序呈现,需采用回溯绘制的递归逻辑:

  • 递归函数先按顺序处理四个子地块,完成所有子地块的细分与绘制后,再绘制当前父地块的边界。
  • 利用递归栈“后进先出”的特性,实现从最底层子地块到顶层父地块的逆序绘制,确保颜色层级按需求呈现。
  • 若需按子地块的逆顺序(如右下→左下→右上→左上)处理,只需调整递归调用子地块的顺序即可。

3. 递归实现的注意事项与挑战

  • 无全局变量约束:所有状态(当前地块坐标、尺寸、层级、颜色列表、图像数据)必须通过函数参数传递,避免使用全局变量。例如,将原RGB元组列表转换为可变列表,作为参数传入递归函数修改像素。
  • 递归深度控制:设置最大细分层级或最小地块尺寸阈值(如宽度/高度小于4像素),防止递归过深导致栈溢出。
  • 边界坐标精准计算:子地块的坐标与尺寸需用整数除法确保对齐,示例代码如下:
    half_w = w // 2
    half_h = h // 2
    sub_plots = [
        (x, y, half_w, half_h),          # 左上
        (x + half_w, y, half_w, half_h), # 右上
        (x, y + half_h, half_w, half_h), # 左下
        (x + half_w, y + half_h, half_w, half_h) # 右下
    ]
    
  • 颜色扩展性:当层级较多时,可通过简单算法生成颜色(如按层级循环调整RGB通道亮度),避免手动定义大量颜色。

嵌套十字边界的层级识别(RGB元组列表图像)

采用从外向内的递归识别逻辑,基于十字的尺寸与位置判断层级:

  1. 顶层十字识别:找到贯穿整个图像的横向与纵向线条,对应层级0的边界。
  2. 子区域递归识别:将图像按顶层十字划分为四个子区域,在每个子区域内寻找尺寸为当前区域一半的十字,对应层级1,以此类推,直到找不到符合条件的十字为止。
  3. 十字验证逻辑:
    • 横向十字:检查子区域中心行的像素是否为统一边界色,且覆盖子区域全宽度。
    • 纵向十字:检查子区域中心列的像素是否为统一边界色,且覆盖子区域全高度。

代码示例

def recursive_subdivide(image, x, y, w, h, level, colors):
    # 停止条件:地块过小或达到最大层级
    if w < 4 or h < 4 or level >= len(colors):
        return
    # 获取当前层级边界色
    color = colors[level]
    half_w = w // 2
    half_h = h // 2
    # 绘制横向中心边界
    for px in range(x, x + w):
        image[y + half_h][px] = color
    # 绘制纵向中心边界
    for py in range(y, y + h):
        image[py][x + half_w] = color
    # 递归处理子地块(先子后父,实现逆序绘制)
    recursive_subdivide(image, x, y, half_w, half_h, level + 1, colors)
    recursive_subdivide(image, x + half_w, y, half_w, half_h, level + 1, colors)
    recursive_subdivide(image, x, y + half_h, half_w, half_h, level + 1, colors)
    recursive_subdivide(image, x + half_w, y + half_h, half_w, half_h, level + 1, colors)

def function1():
    # 模拟加载图像:生成512x512的白色RGB可变列表
    width, height = 512, 512
    image = [[(255, 255, 255) for _ in range(width)] for _ in range(height)]
    # 定义层级颜色列表
    colors = [(0,0,0), (255,0,0), (0,255,0), (0,0,255), (255,255,0)]
    # 调用递归函数,初始层级为0
    recursive_subdivide(image, 0, 0, width, height, 0, colors)
    # 保存为PPM格式图像(无需第三方库)
    with open("land_subdivision.ppm", "w") as f:
        f.write(f"P3\n{width} {height}\n255\n")
        for row in image:
            f.write(' '.join(f"{r} {g} {b}" for r,g,b in row) + '\n')

if __name__ == "__main__":
    function1()

内容的提问来源于stack exchange,提问作者Lein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 18:54:57