你可以通过暴力搜索位置并扫描大小来解决问题,如果n
是地图边缘的平均像素大小,则时间复杂度为O(n^6)
...
可以通过搜索来加速定位(接受非严格排序数据),例如:
这将导致~O(n^4.log^2(n))
。但要注意,必须正确配置搜索以避免跳过解决方案...大小搜索也可以通过使用类似于此处所做的技术进行改进:
只需使用不同的度量标准,我会为每个x
和y
创建起始和结束位置的LUT表(4个LUT表),这将加速搜索,从而导致~O(n^2.log^2(n))
,而LUT的创建是O(n^2)
。顺便说一下,我有时在OCR中使用相同的LUT,例如这里(最后两张图片):
现在这种方法的问题是它无法正确处理凹多边形,因为可能会有比2个更多的边缘每x,y。因此,为了解决这个问题,您需要拥有更多的LUT并根据多边形中的位置使用它们(将多边形分成“凸”区域)。
因此,将所有这些放在一起看起来像这样:
approx loop (center x) // ~O(log(n))
approx loop (center y) // ~O(log(n))
grow loop (square size to max using) LUT // O(n)
{
grow loop (x size to max while decreasing original square y size) // O(n)
grow loop (y size to max while decreasing original square x size) // O(n)
use bigger from the above 2 rectangles
}
只需不要忘记使用 多边形区域/矩形区域
作为近似误差值。此算法的结果为 〜O(n^2.log^2(n))
,虽然不是很好但仍可行。
另一个选项是将多边形转换为正方形,并使用装箱和/或图形和/或回溯技术来扩展到最大的矩形...但这些不是我的强项,所以我不太自信能给出关于它们的答案。