使用最大网格方块填充多边形

时间:2015-01-28 16:01:00

标签: algorithm 2d polygon rectangles

我有一个二维多边形。

enter image description here

我将它放在正方形网格上并标记完全在形状内的正方形。

enter image description here

我需要找到最大化标记方块数的展示位置。多边形方向是固定的,只能翻译。

enter image description here

我该怎么办?

2 个答案:

答案 0 :(得分:2)

如果我们只能将多边形 P 向右移动并且单元格的宽度等于 w ,那么让我们解决这个问题。

首先,请注意在 [0; 中探索 d P 的距离是足够的。 w),因为如果我们将 P 移动到右边的 w ,我们会得到相同的情况,好像我们根本没有移动它一样。 / p>

S P 成为 P 中当前的单元格数量。假设我们移动了 P 一点。怎么会发生什么?那么,网格的一些顶点现在可能不在 P 之内(让我们称之为 O ),现在一些新的顶点可以在< em> P (设置 I )。如何确定我们是否丢失或获得了任何细胞?如果一个单元格位于 P 并且有一个角落,它位于 O 中,那么我们应该减少 S P 。相反,如果一个单元格在 I 中有角落而其他角落已经在 P 中,那么我们应该增加 S 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像素)?

然后有一个简单的暴力解决方案:

  1. 从一个网格开始,计算正方形。
  2. 2.1-2.10将网格1px向右移动,如果没有,则计算并更新最佳分数。

    1. 将网格向上移动1px,计算并更新最佳分数。

    2. 重复又转到2.1,直到检查完所有可能的解决方案......

    3. 检查方块是否在多边形内是很容易的。你可以实现一个沿着边缘的算法......