如何在python中用相等的非重叠正方形近似地覆盖一个(不一定是凸的)多边形?

Posted

技术标签:

【中文标题】如何在python中用相等的非重叠正方形近似地覆盖一个(不一定是凸的)多边形?【英文标题】:How to approximately cover a (non necessarily convex) polygon with equal non-overlapping squares in python? 【发布时间】:2015-11-24 02:44:35 【问题描述】:

我无法为我想要的东西提出一个明确定义的优化目标,但希望我可以通过一些例子来传递我对我想要的东西的主观感觉。

方块的大小始终相同(例如,1000x1000)。多边形可能有不同的大小。有时多边形可能足够大,可以容纳一个或多个正方形,有时多边形可能足够小,可以容纳在正方形内。在后一种情况下,一个正方形应该以多边形的质心为中心。在前一种情况下,一个或多个不重叠的正方形应该或多或少地覆盖多边形。可以不覆盖多边形的整个区域。例如,如果您需要在边界附近放置一个正方形以覆盖一小部分剩余的未覆盖区域,那么您不应该这样做,因为正方形的大部分都在多边形之外,您将花费一个正方形来小幅增加覆盖区域。

具有或多或少预期解决方案的示例:

小多边形:

大多边形:

请注意,在小多边形的情况下,浪费很多正方形的面积是可以的,因为我们至少需要一个正方形。但是在大多边形的情况下,浪费很多正方形的面积是不好的。

我知道我的规格定义不明确,但我希望有人能猜出我想要什么,也许可以更好地定义目标。

如果有人可以在 python 中显示一些代码来解决它会很棒。如果你使用 shapely 会更好,但不是必须的。

多边形由一系列点 (x,y) 定义,这些点按照它们在列表中出现的顺序连接。

谢谢!

编辑:正方形不应旋转。

【问题讨论】:

在某一点上,您将必须定义一个明确的规则,即多边形可以从正方形下方伸出多少,例如最大面积或正方形的最大百分比或多边形的面积,或者一个点与被覆盖区域的最大距离,或者可能是多边形面积与覆盖它的正方形的组合面积之间的比率。 这个老问题有一些有趣的想法和链接:***.com/questions/3516044/… 【参考方案1】:

这将生成多边形poly 的封面。

import numpy as np
from shapely.geometry import MultiPoint, MultiPolygon, Polygon

def square(x, y, s):
    return Polygon([(x, y), (x+s, y), (x+s, y+s), (x, y+s)])

poly = MultiPoint(np.random.randn(10,2)).convex_hull
grid_size = 0.5
ibounds = np.array(poly.bounds)//grid_size
ibounds[2:4] += 1
xmin, ymin, xmax, ymax = ibounds*grid_size
xrg = np.arange(xmin, xmax, grid_size)
yrg = np.arange(ymin, ymax, grid_size)
mp = MultiPolygon([square(x, y, grid_size) for x in xrg for y in yrg])
solution = MultiPolygon(list(filter(poly.intersects, mp)))

【讨论】:

以上是关于如何在python中用相等的非重叠正方形近似地覆盖一个(不一定是凸的)多边形?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中用二进制信息覆盖 pcolormesh

使重叠的非悬停元素变暗

如何绘制非方形 Seaborn jointplot 或 JointGrid

求两个正方形重叠部分的面积是怎样变化的?

基于索引的非重叠滑动窗口

iOS:按钮的非方形点击区域