我有一个二维多边形。
我将它放在一个正方形网格上,并标记完全在形状内的正方形。
我需要找到能够最大化标记的正方形数量的位置。多边形方向已固定,只能进行平移。
怎样才能实现这个目标?
我将它放在一个正方形网格上,并标记完全在形状内的正方形。
我需要找到能够最大化标记的正方形数量的位置。多边形方向已固定,只能进行平移。
怎样才能实现这个目标?
def signedDistance(vertex, edge):
p = [ closest point of edge to vertex ]
return vertex.x - p.x
Events = { (vertex, edge) : 0 <= signedDistance(vertex, edge) < w }
sort(Events, [ by increasing signedDistance ])
EventsEquiv = { E' : E' is subset of Events and
for any a, b from E'
signedDistance(a.vertex, a.edge) = signedDistance(b.vertex, b.edge) }
S = [ cells in P initially ]
maxS = S
for E' in EventsEquiv:
for e in E':
if e is loss: S -= 1
else if e is acquirement: S += 1
if S > maxS:
maxS = S
该方法类似于扫描线算法。
更新:为了推广这个解决方案,我们需要注意到对于任何最优的P位置都存在另一个最优位置,使得P在边缘上具有网格顶点。因此,解决方案是固定一些网格顶点G,并将P“在”它周围移动,使得P始终按照步骤移动,其中步骤由上述事件产生。该算法花费O(|P| / w)时间。
如果多边形很大,网格方块的大小很小(例如10x10像素)?
那么有一个简单的暴力解决方案:
2.1-2.10将网格向右移动1个像素,计算并更新最佳得分(如果需要)。
将网格向上移动1个像素,计算并更新最佳得分(如果需要)。
重复即进入2.1,直到检查完所有可能的解决方案...
很容易检查一个正方形是否在多边形内。 您可以实现沿着边缘走的算法...