簡體   English   中英

確定矩形是否完全被另一組矩形覆蓋所需的算法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM