这可能是一个更注重数学的问题,但是想在这里问一下,因为它是在CS环境中。我想在另一个(任意)四边形内刻一个矩形,内切四边形可能具有最大的高度和宽度。由于我认为算法类似,我想看看我是否也可以用圆圈做这个。
更清楚地听到我的意思是边界四边形作为一个例子。
以下是我试图实现的内容最大化的两个例子:
我做了一些初步搜索,但没有找到任何确定的内容。似乎某种形式的动态编程可能是解决方案。看起来这应该是一个比我发现的更常见的线性优化问题,也许我正在寻找错误的术语。
注意:对于铭刻的方块,假设我们知道我们正在寻找的目标w / h比率(例如4:3)。对于四边形,假设边不会交叉,并且它将是凹的(如果这简化了计算)。
答案 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,以下几点是顺时针编号。它看起来像这样:
然后我们在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中做了一个快速示例来演示:
此处的最小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
我将把它放到C ++代码中并运行一些测试来查看解决方案是否概括,或者这只是"运气"。
我认为也应该可以用函数替换A = a * b中的a和b,并将其放入一个必须在P1和P2之间定义p1p2等条件下最大化的线性公式中。 ..