如何在任意四边形内刻一个矩形或圆圈

时间:2011-02-06 14:18:36

标签: algorithm optimization graphics bounding-box linear-programming

这可能是一个更注重数学的问题,但是想在这里问一下,因为它是在CS环境中。我想在另一个(任意)四边形内刻一个矩形,内切四边形可能具有最大的高度和宽度。由于我认为算法类似,我想看看我是否也可以用圆圈做这个。

更清楚地听到我的意思是边界四边形作为一个例子。 enter image description here

以下是我试图实现的内容最大化的两个例子: enter image description here enter image description here

我做了一些初步搜索,但没有找到任何确定的内容。似乎某种形式的动态编程可能是解决方案。看起来这应该是一个比我发现的更常见的线性优化问题,也许我正在寻找错误的术语。

注意:对于铭刻的方块,假设我们知道我们正在寻找的目标w / h比率(例如4:3)。对于四边形,假设边不会交叉,并且它将是凹的(如果这简化了计算)。

2 个答案:

答案 0 :(得分:4)

1)圈。
对于三角形,这是来自学校课程的standard math question 对于四边形,您可以注意到最大内圈将至少触及其三个边。因此,采取三面结合,解决每个三角形的问题 平行边的情况必须单独考虑(因为它们不形成三角形),但它并不是非常困难。

2)矩形。
您不能拥有“最大高度和宽度”,您需要选择其他条件。例如,在你的照片上我可以通过降低高度来增加宽度,反之亦然。

答案 1 :(得分:1)

4岁的帖子,但是当我搜索我的问题时,我偶然碰到了它。

我在当前的CV应用程序中有这样的问题。我想出了一个简单而有些笨拙的解决方案来寻找最大的解决方案。虽然不完全相同,因为我最大化矩形的面积而没有固定的边比。

我不知道我的解决方案是否找到了最佳解决方案,或者它是否适用于所有情况。我也认为应该有一种更有效的方式,所以我期待你的意见。

首先,假设一组4个点形成我们的(凸)四边形:

    x   y
P1  -2  -5
P2  1   7
P3  4   5  
P4  3   -2

对于此程序,最左边的点是P1,以下几点是顺时针编号。它看起来像这样:

quadrilateral

然后我们在Points之间创建线性函数。对于每个函数,我们必须知道斜率k和距离0:d的距离。 k只是两点的Y之差除以X的差。 d可以通过求解d的线性函数来计算。所以我们有

k=dy/dx
d=y1-k*x1

我们还需要反函数。

k_inv = 1/k
d_inv = -d/k

然后我们为四边形的每一边创建函数和反函数

        k        d                        k         d
p1p2    4       3           p1p2_inv    0.25    -0.75
p2p3    -0.67   7.67        p2p3_inv    -1.5    11.5
p3p4    7       -23         p3p4_inv    0.14    3.29
p4p1    0.6     -3.8        p4p1_inv    1.67    6.33

如果我们有完全水平或垂直线,我们最终会在其中一个函数或反函数中得到DIV / 0,因此我们需要单独处理这个案例。

现在我们遍历由两个函数包围的所有角,这些函数具有带有不同符号的斜率的k。在我们的情况下,将是P2和P3。

我们从P2开始,以适当的步长迭代P2和P1和P3中较高的一个之间的y值,并使用反函数计算水平方向上函数之间的距离。这将给我们矩形的一面

a=p2p3_inv(y)-p1p2_inv(y)

在两个x值x = p2p3_inv(y)和x = p1p2_inv(y)的情况下,我们计算y与两个相反函数的差值,并将距离到当前y位置作为第二个边的候选者。我们的矩形。

b_candidate_1 = y-p4p1(p2p3_inv(y))
b_candidate_2 = y-p4p1(p1p2_inv(y))
b_candidate_3 = y-P3p4(p2p3_inv(y))
b_candidate_4 = y-P3p4(p1p2_inv(y))

四个参数中较小的一个是b侧的解决方案。 该区域显然变成了* b。

我在excel中做了一个快速示例来演示:

enter image description here

此处的最小b为6.9,因此解决方案的右上角位于p2p3上,矩形在水平方向上延伸,b在垂直方向上分别向左和向下延伸。

因此矩形的四个点是

Rect    x       y
R1      0.65    -1.3
R2      0.65    5.6
R3      3.1     5.6
R4      3.1     -1.3

enter image description here

我将把它放到C ++代码中并运行一些测试来查看解决方案是否概括,或者这只是"运气"。

我认为也应该可以用函数替换A = a * b中的a和b,并将其放入一个必须在P1和P2之间定义p1p2等条件下最大化的线性公式中。 ..