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 可以通过求解 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,因此我们需要单独处理这种情况。
现在我们遍历由两个函数包围的所有角,这些函数具有 ak 和带有不同符号的斜率。在我们的例子中,这将是 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 上,矩形在水平方向上延伸 a,在垂直方向上分别延伸到左侧和底部。
因此矩形的四个点是
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 之间定义等条件下最大化...