我有一个二维多边形。
我将它放在正方形网格上并标记完全在形状内的正方形。
我需要找到最大化标记方块数的展示位置。多边形方向是固定的,只能翻译。
我该怎么办?
答案 0 :(得分:2)
如果我们只能将多边形 P 向右移动并且单元格的宽度等于 w ,那么让我们解决这个问题。
首先,请注意在 [0; 中探索 d P 的距离是足够的。 w),因为如果我们将 P 移动到右边的 w ,我们会得到相同的情况,好像我们根本没有移动它一样。 / p>
让 S P 成为 P 中当前的单元格数量。假设我们移动了 P 一点。怎么会发生什么?那么,网格的一些顶点现在可能不在 P 之内(让我们称之为 O ),现在一些新的顶点可以在< em> P
现在让我们通过增加它与 P 的初始位置的距离来对这些事件(获取和丢失顶点)进行排序。因此,我们正式确定了我们的小步骤&#34;在算法中。
现在我们可以编写一些伪代码:
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
该方法接近sweep line。
UPD:为了概括这一点,我们需要注意,对于 P 的任何最佳位置,存在 P 具有网格顶点的另一个最佳位置在边缘。因此,解决方案是修复一些网格顶点 G 并移动 P &#34;围绕&#34;因此 P 在边缘上一步一步地具有 G ,其中步骤由发生的事件产生,如上所述。算法需要 O (| P | / w )。
答案 1 :(得分:1)
多边形很大,网格的大小方块很小(例如10x10像素)?
然后有一个简单的暴力解决方案:
2.1-2.10将网格1px向右移动,如果没有,则计算并更新最佳分数。
将网格向上移动1px,计算并更新最佳分数。
重复又转到2.1,直到检查完所有可能的解决方案......
检查方块是否在多边形内是很容易的。你可以实现一个沿着边缘的算法......