2015-07-03 73 views
2

我有框對象的數組,可以通過(X,Y,寬度,高度)等特性這樣定義:算法上擴展一個框來填充的空間

enter image description here 盒Q在角點C.錨定我如何以編程方式擴展盒子Q以佔用其擁有的所有可用空間,同時保持其縱橫比?

我已經有一些運氣通過擴大箱子非常大(從右上角),然後對齊到最遠的盒子的頂部邊緣(在這種情況下是5)。如果此時其他盒子與Q重疊,我移除最遠的盒子(5)並重復(對齊4的頂部邊緣),直到沒有盒子重疊爲止。這種方法的問題是,一個盒子可與Q(框2的下一個圖像中)重疊,但是當我擴展,以滿足它的頂部邊緣,它不再包含,例如:

enter image description here

任何想法的方法將不勝感激,

喬希

+0

「如果他們這樣做,我把他們刪除」---什麼是「他們」?你不是故意刪除你的例子中的方框2? – Petr

+0

編輯澄清,謝謝。 – Josh

+0

除了上邊緣之外,您還應該縮放以符合右邊緣,並檢查實際上遇到的是哪一個,然後選擇較小的一個。在你的例子中,如果你通過延伸其底邊來對齊2的頂邊來縮放Q,則矩形不會相遇。如果通過延長其左邊緣以滿足2的右邊緣來縮放Q,則它們會相遇,所以這是實際的限制。如果兩者都符合,則選擇最小值。 –

回答

2

但是當我擴展,以滿足其頂部邊緣,它不再包含

而是擴展,以滿足其

  1. 頂部邊緣
  2. 底邊
  3. 左邊緣
  4. 右邊緣

然後,查看哪個縮放比例有效(縮放後包含該框)並導致最大的框。

+0

這可能不是最有效的方式,但它是一種有效的方法,謝謝ciamej。 – Josh

1

我可以在這裏看到兩種方法。

首先是遍歷所有其他框。對於每個箱子B,看多少(按什麼因素),你可以擴大你的給定框Q,使它會觸摸框B;之後,採取所有這些因素的最低限度。但是,找到給定B的這個因子是一項不平凡的任務,但絕對可以解決。同時,如果您已經有一個代碼檢查給定因子的重疊,那麼您可以應用二分查找來找出不會導致重疊的最大因子。

所以你知道,如果你擴大了很多(例如x次),它確實重疊。如果您不擴展它(即,擴大1次),它不會重疊。所以你有一個段[1,x]在哪裏尋找答案。嘗試中間---擴大(x+1)/2次,看它是否重疊。如果重疊,則繼續使用段[1, (x+1)/2],否則使用段[(x+1)/2, x]。以新細分的中間,等等,直到細分的最終值足夠接近。

1

創建一個將縮放因子作爲參數的函數,並根據是否存在重疊返回true或false。看起來你已經有這樣的功能寫了。

然後使用平分搜索https://en.wikipedia.org/wiki/Bisection_method找到滿足閾值的縮放因子。

相關問題