![](/img/trans.png)
[英]Algorithm required to determine if a rectangle is completely covered by a set of polygons
[英]Algorithm required to determine if a rectangle is completely covered by another set of rectangles
我正在尋找一種算法,該算法將確定一個新矩形是否被一組現有矩形完全覆蓋。 提出問題的另一種方法是,新矩形是否完全存在於現有矩形覆蓋的區域?
似乎有很多算法來確定矩形重疊等等,但我找不到能解決這個問題的任何東西。
矩形將使用x,y坐標表示。 該問題涉及地理繪圖。
編輯 - 來自OP發布的評論:
矩形在X / Y軸上對齊
如果矩形對齊很容易:
假設您有矩形A0並想知道它是否被(B1,B2,B3 ......)完全覆蓋= B
A := (A0)
while P := pop B
for R in A
if P fully covers R:
remove R from A
else if P and R does overlap:
remove R from A
break R in subrentangles S := (S1, S2, S3,...) following the intersections \
with P edges
push S into A
if A is empty:
say B covers A0
else:
say B does not fully cover A0
如果矩形都具有相同的角度; 然后以下可能會更有效,更容易編程:
確定矩形覆蓋y坐標的每個y坐標(您只需對覆蓋變化的y坐標執行此操作;即對應於矩形的上限或下限)。 一旦你知道了,解決每個這樣的y坐標的問題(即檢查所有x值是否被該Y坐標“活動”的矩形覆蓋)。
編輯:我認為這是O(n ^ 2 log(n)^ 2)的復雜性,因為兩種類型都是你需要做的艱苦工作
我過去做過類似的事。 我的想法是將新矩形與現有的每個矩形進行比較(逐個)
如果有一個交叉點丟棄它(相交的部分),並將未覆蓋的段添加到矩形數組中
接下來,搜索新段與其他現有(仍未檢查)矩形之間的交集。
算法遞歸地丟棄交叉點,只留下未覆蓋的部分。
最后,如果數組中沒有矩形,則表示完全重疊
如果陣列中仍有一些矩形,則重疊不完整,因為仍有一些部分留下。
希望這可以幫助
如果這是您正在尋找的,我可以嘗試找到我的代碼。 我認為它在C#
另一個想法是將所有現有的矩形轉換為多邊形,然后檢查新的矩形是否在多邊形內部,但如果您沒有使用知道如何使用多邊形的語言(或框架),我不建議這樣做。
R樹可能很有用。 如果可能有旋轉的矩形,則可以將它們包含在邊界矩形中。
試試這個
源矩形:X0,Y0,寬度,高度
//基本上比較邊緣
if(((X0> = xi)&&(X0 + breadth <= Xi))&&((Y0> = Yi)&&(Y0 + height <= Yi)){//考慮矩形} else {// discard}
這是我的代碼,正如您所要求的:
第一種方法是“減去”(返回未覆蓋的部分)的2個矩形。
第二種方法從基本矩形中減去矩形列表。
在您的案例列表中包含現有的矩形,新的矩形是基礎
檢查是否存在完整的交集,從第二個方法返回的列表應該沒有元素。
public static List<Rectangle> SubtractRectangles(Rectangle baseRect, Rectangle splitterRect)
{
List<Rectangle> newRectaglesList = new List<Rectangle>();
Rectangle intersection = Rectangle.Intersect(baseRect, splitterRect);
if (!intersection.IsEmpty)
{
Rectangle topRect = new Rectangle(baseRect.Left, baseRect.Top, baseRect.Width, (intersection.Top - baseRect.Top));
Rectangle bottomRect = new Rectangle(baseRect.Left, intersection.Bottom, baseRect.Width, (baseRect.Bottom - intersection.Bottom));
if ((topRect != intersection) && (topRect.Height != 0))
{
newRectaglesList.Add(topRect);
}
if ((bottomRect != intersection) && (bottomRect.Height != 0))
{
newRectaglesList.Add(bottomRect);
}
}
else
{
newRectaglesList.Add(baseRect);
}
return newRectaglesList;
}
public static List<Rectangle> SubtractRectangles(Rectangle baseRect, List<Rectangle> splitterRectList)
{
List<Rectangle> fragmentsList = new List<Rectangle>();
fragmentsList.Add(baseRect);
foreach (Rectangle splitter in splitterRectList)
{
List<Rectangle> toAddList = new List<Rectangle>();
foreach (Rectangle fragment in fragmentsList)
{
List<Rectangle> newFragmentsList = SubtractRectangles(fragment, splitter);
toAddList.AddRange(newFragmentsList);
}
if (toAddList.Count != 0)
{
fragmentsList.Clear();
fragmentsList.AddRange(toAddList);
}
}
return fragmentsList;
}
您可以使用用於計算矩形的並集區域的算法。 如您要檢查矩形a是否被矩形B = {b_1,b_2,...,}覆蓋。
首先計算B中矩形的聯合區域,我們得到area_1作為值。
然后你計算B + {a}中矩形的聯合區域,我們得到area_2作為值。
因此,如果area_1 == area_2,那么您確定矩形a被矩形B覆蓋。否則,答案是錯誤的。
所以主要問題是如何計算矩形的聯合面積。 這個問題可以通過現有的優秀算法來解決。 該算法可以簡要介紹為首先對矩形點的值進行離散化,然后使用分割樹來加速每個塊的面積計算。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.