为了进行碰撞检测,我希望将位图转换为尽可能少的矩形集合。问题的更正式描述在标题中已说明。以下是一个例子:
对于多个解决方案的抉择,我更倾向于最大化所有矩形组合覆盖的总面积。例如,上图中的蓝色矩形可以更小,但那不是最优的解决方案。
这个问题有更常见的名称吗?有哪些文献资料?或者有简单的算法可以给出最优解吗?
这个问题有更常见的名称吗?有哪些文献资料?或者有简单的算法可以给出最优解吗?
这个问题可能是NP-hard的,但如果您想要在未经过NP难度约简创建的情况下获得最高质量的解决方案,那么运行整数规划求解器是值得一试的。即使运行时间是个问题,与标准答案进行比较也可能很有用。
实质上,您正在尝试解决称为集合覆盖的问题的一个特殊情况。这是如何将集合覆盖制定为整数规划的。
minimize sum_{white rectangles R} x_R
subject to
for all white points p, sum_{white rectangles R such that p in R} x_R >= 1
for all white rectangles R, x_R in {0, 1}
k
) 的情况下进行一次优化即可。maximize sum_{white rectangles R} area(R) x_R
subject to
for all white points p, sum_{white rectangles R such that p in R} x_R >= 1
for all white rectangles R, x_R in {0, 1}
sum_{white rectangles R} x_R <= k
我建议从尚未被矩形覆盖的外部角落开始,贪心地扩展该矩形。重复此过程直到覆盖所有内容。我认为这并不能在全局范围内给你所需的决策优先权(因为你可能有多个选项来贪婪地扩展每个矩形),但在局部范围内是可以的。
我以一种足够好的方式解决了这个问题——虽然可能不是最优解。
创建一个尺寸与位图相同的二维数组。对于位图中的每个黑色像素,将相应的元素设置为WALL,否则为空的空间EMPTY_SPACE。
从左到右、从上到下扫描数组,找到第一个EMPTY_SPACE,保存该坐标。
创建一个面积为1的矩形,其左上角坐标设置为在步骤2中找到的坐标,向下和向右各延伸1个单位。
水平扩展矩形向左和向右,只要不覆盖任何 WALL。
垂直扩展矩形向上和向下,只要不覆盖任何 WALL。
标记矩形覆盖的任何元素为COVERED_SPACE,并将矩形添加到矩形集合中。
如果仍有包含 EMPTY_SPACE 的元素,请转到步骤2,否则完成。