【问题标题】:The largest aligned rectangular with fixed aspect ratio in an arbitrary convex polygon?任意凸多边形中具有固定纵横比的最大对齐矩形?
【发布时间】:2021-10-20 10:19:02
【问题描述】:

如何计算任意凸多边形中固定纵横比的最大对齐矩形的宽度/高度?

此图像显示了不同凸多边形(黑色)中的此类矩形(红色)的示例:

.

我发现了关于主题的不同论文,但它们不适合我的限制。这很奇怪,因为他们应该大大简化算法,但不幸的是我没有找到任何线索。

【问题讨论】:

  • 不失一般性,你可以解出一个正方形。

标签: algorithm geometry computational-geometry convex-optimization


【解决方案1】:

固定比率确实简化了问题,因为现在有一个线性程序。

你想找到 x1, y1, x2, y2 以最大化 x2 - x1 受限于 (x2 - x1) h = w (y2 - y1) 其中纵横比为 w:h,并且对于每个线性定义凸多边形的不等式,每个点 (x1, y1), (x1, y2), (x2, y1), (x2, y2) 都满足。

例如,考虑这个凸多边形:

四点矩形的线性规划(x_1, y_1), (x_1, y_2), (x_2, y_2) , (x_2, y_1), 纵横比 r = w / h 和上面的多边形内接如下:

理论上,低维线性规划有专门的算法,可以在线性时间内运行。在实践中,您可以使用求解器。如果你想自己编写代码,那么你可以使用单纯形法,但梯度下降更简单。

首先让我们摆脱等式约束和一个变量,通过在 x1 = (x - wz), y1 = (y - hz) 的多边形点约束条件下最大化变量 x, y, z 上的 z, x2 = (x + wz), y2 = (y + hz)。其次,让我们用这些约束换取一个客观的术语。通常,多边形内的点约束看起来像(到半平面的有符号距离)≤ 0。相反,我们将对目标应用惩罚项。设 α > 0 为参数。新项是 -exp(α (到半平面的有符号距离))。如果有符号距离是负数(点在半平面内),那么随着 α 趋于无穷大,惩罚将变为零。如果有符号距离为正,则惩罚为负无穷大。如果我们使α足够大,那么变换后问题的最优解将是近似可行的。

这就是它在 Python 中的样子。我不是持续优化专家,所以请谨慎购买。

# Aspect ratio.
w = 3
h = 2

# Represented as intersection of half-spaces a*x + b*y - c <= 0 given below as
# (a, b, c). For robustness, these should be scaled so that a**2 + b**2 == 1,
# but it's not strictly necessary.
polygon = [(1, 1, 20), (1, -2, 30), (-2, 1, 40)]

# Initial solution -- take the centroid of three hull points. Cheat by just
# using (0, 0) here.
x, y, z = (0, 0, 0)

from math import exp

# Play with these.
alpha = 10
rate = 0.02

for epoch in range(5):
    for iteration in range(10 ** epoch, 10 ** (epoch + 1)):
        # Compute the gradient of the objective function. Absent penalties, we
        # only care about how big the rectangle is, not where.
        dx, dy, dz = (0, 0, 1)
        # Loop through the polygon boundaries, applying penalties.
        for a, b, c in polygon:
            for u in [-w, w]:
                for v in [-h, h]:
                    term = -exp(alpha * (a * (x + u * z) + b * (y + v * z) - c))
                    dx += alpha * a * term
                    dy += alpha * b * term
                    dz += alpha * (a * u + b * v) * term
        x += rate * dx
        y += rate * dy
        z += rate * dz
    print(x, y, z)

【讨论】:

  • 非常感谢您的回答。我已经在几个示例上测试了您的方法,并且效果很好。它不仅找到了最大矩形的宽度/高度,还找到了该矩形的坐标。
  • @grom 如果此代码对性能不敏感,您也可以进行梯度下降。我稍后会发布一个示例。
  • @grom 添加了代码。如果您打算在生产中使用自制梯度下降,您可能应该查找正确的方法。
  • @grom 你明白了。
  • @grom 想一想,Seidel 的随机线性规划算法非常简单(至少在您尝试处理退化情况之前)。
【解决方案2】:

提示:

WLOG 矩形可以是正方形(必要时拉伸空间)。

然后解决方案由距离图的最高点到多边形给出,在 Chebyshev 度量 (L∞) 中。它可以通过中轴变换来确定,而中轴变换本身是从 Voronoi 图获得的。

【讨论】:

  • 我要试试你的方法。谢谢。
  • @grom:请注意该指标是非标准的。
  • 对不起,我卡住了。我仍然需要更深入地了解如何为 Chebyshev 度量构建 Voronoi 图。看起来这是一项相当艰巨的任务。
  • @grom:一旦你知道了线段或角度图的几何形状,它应该会变得更容易。
  • @grom:别担心,我只是给了一个提示。我知道完整的解决方案是艰巨的。
猜你喜欢
  • 2023-04-11
  • 2018-10-18
  • 1970-01-01
  • 2019-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 2011-05-15
相关资源
最近更新 更多