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