4岁的线程,但我碰巧绊倒它时,谷歌搜索我的问题。
我在当前的CV应用程序中有这样的问题。我想出了一个简单而有点笨拙的解决方案,以找到最大的。不完全相同,因为我没有一个固定的边的比例最大化矩形的面积。
我还不知道我的解决方案是否能找到最佳解决方案,或者它是否适用于所有情况。我也认为应该有一个更有效的方法,所以我期待着你的意见。
首先,假设一组4个点形成我们的(凸)四边形:
x y
P1 -2 -5
P2 1 7
P3 4 5
P4 3 -2
对于此过程中最左边的点是P1,有以下几点被编号顺时针方向旋转。它看起来像这样:
然后,我们创建点之间的线性函数。对于每个函数,我们必须知道斜率k和从0到d的距离。 k只不过是两点的Y的差异除以X的差异而已。可以通过求解d的线性函数来计算d0。所以我们有
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或者反函数,因此我们需要分别处理这种情况。
现在我们通过两个函数所包含的所有角落,这两个函数具有不同符号的斜率。在我们的情况下,这将是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方案的解决方案。 该地区显然成为a * 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代入函数,并将它放入一个必须在p1p2仅在P1和P2之间定义的条件下必须最大化的线性公式中。 ...
Re。圆形:您可以将四边形视为截止三角形。即为四边形的每个边缘,使相邻的边缘更长,直到它们相遇。在你的新三角形上划一个圆圈。检查它是否适合您的原始四边形。这样获得的最大圈子应该是最优圈子。显然你需要分别处理平行边的四边形。 – toochin 2011-02-06 14:26:11
如果您允许凸面四边形和其片段重叠的四边形,则可能会遇到任意四边形的困难时间。你的意思是任意的*凸*四边形? – 2011-02-06 14:37:18
矩形也可以旋转,还是必须平行于“水平”? – kohlehydrat 2011-02-06 15:07:32