找到四边形内最大的矩形

时间:2012-07-18 19:13:56

标签: algorithm math

最近,我已经扫描了很多专辑封面,试图将我的音乐收藏数字化。扫描后的默认程序是旋转和裁剪。

对于旋转,重要的是找到一条或多条参考线。旋转后,“正常”线将或多或少水平(或垂直),奇数线将略微倾斜。可以区分两个“不同”的旋转:

Two quadrilaterals

注意:两个四边形是两张专辑封面。你可以想象专辑中的两行作为两条印刷线。所有参考线都以粗体显示。您可能想知道为什么专辑封面不仅仅是矩形,而是请注意这张图片大大夸大了。也就是说,如果你仔细看过专辑封面,你会发现他们很少接近一个矩形。

在情况A中,很明显大多数覆盖边缘是平行的并且形成90度角,和/或印刷物体过度倾斜,这表明印刷品本身是倾斜的。在这两种情况下,我都可以更好地使用封面边缘作为参考。

在情况B中,大多数线条看似不规则,印刷品似乎没问题。然后我更好地使用打印的对象作为参考。

总而言之,这主要是一个直观的过程。

虽然上述内容不是实际问题的一部分,但我认为首先了解背景信息对您有用。我们现在已经到了裁剪步骤,这个部分一直困扰着我。

我的问题很简单:如果我必须裁剪任何专辑封面,我怎么能以这样的方式裁剪它让我留下专辑封面的最大部分?换句话说,如何找到共同形成四边形内最大可能矩形的4个值?

唯一的条件是矩形必须与参考线平行,即水平。

1 个答案:

答案 0 :(得分:-2)

如果您接受约束,即给定的矩形将与现实世界中的x和y轴对齐,而不是倾斜,则可以执行以下操作

Given that point contains values x,y
Given quadrilateral roughly formed by

    A
                  B

      C          D

A rectangle may be formed via the following

leftX = max(A.x,C.x) 
topY = min(A.y,B.y)
rightX = min(B.x,D.x)
botY = max(C.y,D.y)

rectA = point(leftX, topY)
rectB = point(rightX, topY)
rectC = point(leftX, botY)
rectD = point(rightX, botY)