什麼是從另一個邊界框中減去邊界框的最好或有效方法(即,從邊界框布爾減法創建n個邊界框)?邊界框布爾減法?
理想情況下,由此產生的包圍盒儘可能地平方,以便有限的「碎片」(即,1寬度,1高度,100深度)。
什麼是從另一個邊界框中減去邊界框的最好或有效方法(即,從邊界框布爾減法創建n個邊界框)?邊界框布爾減法?
理想情況下,由此產生的包圍盒儘可能地平方,以便有限的「碎片」(即,1寬度,1高度,100深度)。
這個問題已經很老了,但自從我做到了,我會回答它。
首先想到兩個範圍(包圍盒)作爲同心正方形。我們從外部減去內部的一個。
A----------------------------------B
| |
| A----------------------B |
| | | |
| | | |
| D----------------------C |
| |
D----------------------------------C
然後,你將最終得到8個盒子。
A----------------------------------B
| 1 | 2 | 3 |
|----------------------------------|
| | | 4 |
| 8 | | |
|----------------------------------|
| 7 | 6 | 5 |
D----------------------------------C
所以,訣竅是做廣場。大多數圖形庫都有代碼來處理'範圍'。我將使用Javascript中的OpenLayers作爲示例。這個想法是,你通過繪製每對點的對角線並獲得邊界框,然後使用一些先前製作的邊界框的點進行級聯,從而製作範圍(邊界框)。下面的代碼應該是自我解釋的。我們減去程度E2,其被描繪爲內部範圍,從某種程度上E1,其被描繪爲外部範圍:
var b1 = ol.extent.boundingExtent([ol.extent.getTopLeft(e1), ol.extent.getTopLeft(e2)]);
var b2 = ol.extent.boundingExtent([ol.extent.getBottomLeft(b1), ol.extent.getBottomLeft(e2)]);
var b3 = ol.extent.boundingExtent([ol.extent.getBottomLeft(e1), ol.extent.getBottomLeft(e2)]);
var b4 = ol.extent.boundingExtent([ol.extent.getBottomLeft(b3), ol.extent.getBottomRight(e2)]);
var b5 = ol.extent.boundingExtent([ol.extent.getBottomRight(e1), ol.extent.getBottomRight(e2)]);
var b6 = ol.extent.boundingExtent([ol.extent.getBottomRight(b5), ol.extent.getTopRight(e2)]);
var b7 = ol.extent.boundingExtent([ol.extent.getTopRight(e1), ol.extent.getTopRight(e2)]);
var b8 = ol.extent.boundingExtent([ol.extent.getTopLeft(e1), ol.extent.getTopLeft(b7)]);
例如,注意我們如何使用從邊框B1使B2的座標, b3使b4等
現在我們知道,範圍可能不是同心。有些框可能超出我們的答案。然而,需要注意的一個很酷的情況是,如果減法範圍(e2)的一個角落在基本範圍(e1)內,那麼我們需要三個連接的盒子。所以,如果e2的左上角在e1中,那麼我們需要b1,b2和b8。同樣,如果e2的左下角在e1中,那麼我們需要b6,b7和b8。您可能會注意到一些重複內容,例如b8,但我們稍後會將其過濾掉。所以,讓我們收集我們的結果。
var results = [];
if (ol.extent.containsCoordinate(e1, ol.extent.getTopLeft(e2))) {
results.push(b1, b2, b3);
}
if (ol.extent.containsCoordinate(e1, ol.extent.getTopRight(e2))) {
results.push(b8, b7, b6);
}
if (ol.extent.containsCoordinate(e1, ol.extent.getBottomRight(e2))) {
results.push(b6, b5, b4);
}
if (ol.extent.containsCoordinate(e1, ol.extent.getBottomLeft(e2))) {
results.push(b2, b3, b4);
}
消除重複,還要注意這樣的事實,尤其是在範圍共享邊界的情況下,其中的一些盒子將是「空」。通常情況下,您可以通過與範圍相關的getArea()函數來計算出結果。下面是一個聰明的JavaScript方法來過濾掉數組中的重複對象,因爲Array.indexOf使用'==='並且只返回它的第一個匹配。而且,我們只收集實際上有區域的盒子。
results = results.filter(function(a,i,arr) {
return arr.indexOf(a) === i && ol.extent.getArea(a) > 0;
});
注意事項使用:
要注意,如果兩個初始邊界框不相交,將導致一個空的列表。所以,這種方法只適用於相交的範圍。圖形庫通常具有用於兩個區域相交的布爾函數。例如,如果您正在尋找加載潛在範圍(e1)減去已加載(e2)並且它們不相交的潛在範圍(e1),那麼您可能只想直接加載e1。取決於你的申請。
希望這答案對某人有用!
是否有您喜歡的解決方案的特定語言,或者您剛剛使用算法? – 2010-10-25 00:17:49
我使用c#,但如果有人用另一種語言,我可以很容易地轉換它。 – 2010-10-25 00:37:12
有沒有這樣的運氣?你可以在JavaScript中做同樣的事情嗎? – Baz1nga 2011-04-26 22:02:58