我的目标是采用矩形网格并将它们组合在一起,以减少矩形的数量。如果没有任何内容,则每个网格都标记为False,否则它包含一个名为level的值的矩形。具有匹配级别的矩形可以使用union_ip与另一个合并,union_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