把较小的矩形组合成较大的矩形

2024-03-28 22:55:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我的目标是用一个矩形网格来组合它们,这样可以减少矩形的数量。如果每个网格中没有任何内容,则将其标记为False,否则它将包含一个名为level的值的矩形。具有匹配级别的矩形可以使用union\u ip与另一个矩形合并,union\u ip将两个矩形合并为一个矩形。结果应返回新合并矩形的列表。你知道吗

但我的行为越来越不一致。Here is an example。黑色区域包含矩形,而白色区域不包含矩形。较粗的红线显示合并的结果。右上角是我正在测试的当前案例中生成的内容。左下角的情况下,我正在寻找,但它只能与一个边界或如果只有顶部或底部的边界被添加。你知道吗

如果有人能帮忙,我会很感激的。我知道代码是一团糟,但它一直工作到现在。你知道吗

def getGrid():
    grid = {}
    for i in xrange(0, 18):
        grid[i] = {}
        for j in xrange(0, 18):
            grid[i][j] = False;

    return grid

def getReducedRects(grid):
    tablx = {}
    myrect = False

    x_max, y_max = len(grid), len(grid[0]);

    for x in xrange(0, x_max):
        for y in xrange(0, y_max):
            if grid[x][y]:
                if myrect:
                    if grid[x][y].level == myrect.level:
                        myrect.union_ip(grid[x][y])
                    else:
                        try:
                            tablx[x].append(myrect);
                        except:
                            tablx[x] = [];
                            tablx[x].append(myrect);

                        myrect = grid[x][y];
                else:
                    myrect = grid[x][y].copy();

            else:
                if myrect:
                    try:
                        tablx[x].append(myrect);

                    except:
                        tablx[x] = [];
                        tablx[x].append(myrect);

                    myrect = False;

    for x in xrange(0, x_max - 1):
        try:
            le = len(tablx[x]);
            tablx[x + 1];
        except:
            continue;

        i = 0
        while i < le:
            r = tablx[x][i];
            coll = aabb_collision_single(r, tablx[x + 1]);
            for rc in coll:
                if rc.bottom == r.bottom and rc.top == r.top and r.level == rc.level:
                    rc.union_ip(r);
                    del(tablx[x][i]);
                    le -= 1;
                    i -= 1;
                    break;

            i += 1;

    myr = []
    for r in tablx.itervalues():
        myr += r;

    return myr

通过在列末尾添加另一个检查来解决!对不起,我的意大利面代码太长了,但它现在可以正常工作了。你知道吗

def getReducedRects(grid):
    tablx = {}
    myrect = False

    x_max, y_max = len(grid), len(grid[0]);

    for x in xrange(0, x_max):
        for y in xrange(0, y_max):
            if grid[x][y]:
                if myrect:
                    if grid[x][y].level == myrect.level:
                        myrect.union_ip(grid[x][y])
                    else:
                        try:
                            tablx[x].append(myrect);
                        except:
                            tablx[x] = [];
                            tablx[x].append(myrect);

                        myrect = grid[x][y];
                else:
                    myrect = grid[x][y].copy();

            else:
                if myrect:
                    try:
                        tablx[x].append(myrect);

                    except:
                        tablx[x] = [];
                        tablx[x].append(myrect);

                    myrect = False;

        if myrect:
            try:
                tablx[x].append(myrect);

            except:
                tablx[x] = [myrect];

            myrect = False;

    for x in xrange(0, x_max - 1):
        try:
            le = len(tablx[x]);
            tablx[x + 1];
        except:
            continue;

        i = 0
        while i < le:
            r = tablx[x][i];
            coll = aabb_collision_single(r, tablx[x + 1]);
            for rc in coll:
                if rc.bottom == r.bottom and rc.top == r.top and r.level == rc.level:
                    rc.union_ip(r);
                    del(tablx[x][i]);
                    le -= 1;
                    i -= 1;
                    break;

            i += 1;

    myr = []
    for r in tablx.itervalues():
        myr += r;

    return myr

Tags: infalseforiflevelmaxgridrc