idz*_*idz 11
通常,您使用所谓的扫描线算法来解决这些问题.在您的案例候选矩形中,他们一次检查一行(或扫描线)的数据,构建您正在寻找的答案.
这是一个如何工作的大致轮廓.
将图像中的所有行编号为0..6,我将从下往上工作.
检查第0行,你有两个矩形的开头(我假设你只对黑色方块感兴趣).我将使用(x,y,width,height)来引用矩形.两个活动矩形是(1,0,2,1)和(4,0,6,1).您将这些添加到活动矩形列表中.此列表按增加x坐标排序.
您现在已完成扫描线0,因此您可以增加扫描线.
检查第1行,您将看到行是否有以下任何一项:
当您沿着该行工作时,您将看到您有一个新的活动矩形(0,1,8,1),我们可以将现有的一个活动矩阵增长到(1,0,2,2),我们需要删除有效(4,0,6,1)用两个较窄的替换它.我们需要记住这个.这是我们迄今为止看到的最大规模.它被两个新的活动替换:(4,0,4,2)和(9,0,1,2)
因此,在发送扫描线1时,我们有:
您将继续这种方式,直到扫描线用完为止.
棘手的部分是编写沿扫描线运行的例程来更新活动列表.如果你做得正确,你只会考虑每个像素一次.
希望这可以帮助.描述有点棘手.
我喜欢这个区域增长的方法.
...将是一个彻底但可能不是最有效的方法.
我想你需要回答一个哲学问题"点线是一个瘦的矩形吗?" 如果一行==一个细长矩形,您可以进一步优化:
使用第一种方法检查您的工作.我认为Knuth说"......过早的优化是所有邪恶的根源."
HTH,
佩里
附录:稍后进行了几次编辑,我认为这个答案值得一组投票.