2017-04-11 40 views
0

在2D空間中,有一些矩形。它們會增長或縮小,有些會同時增長/縮小。當一個矩形增長時,它的左上角將不會移動,即只有底部或右邊緣可以移動。在2D空間中排列展開/縮小的矩形

我們需要重新定位重疊的矩形。我們要確保重新定位的二維空間在視覺上與先前的空間相似(即我們不應該混洗它們,不應該引入不必要的空白空間(如果可能的話)不應該更改每個矩形的最接近的矩形)。

已知值:空間

  • 大小
  • 兩個相鄰矩形
  • 尺寸的矩形(尺寸&之前,改變之後)的矩形的
  • 位置之間的距離

矩形如何有效地重新定位?應該使用什麼算法,以便一組操作可以解決一組衝突(因爲某些矩形可能對齊並且具有相同的大小)?我們如何根據座標猜測相鄰矩形之間的關係,並巧妙地重新定位它們。

一些例子:

  • 殼體1:生長/收縮垂直(簡單)
  • 情況2:生長/在水平方向收縮(複雜它假定有2個矩形基,leftright,而不是。 topbottomleft變化,right重新定位爲如圖中所示下文)
  • 情況3:生長/收縮水平(簡單)

Examples

電流溶液

//required values: distance between two adjacent rectangles, sizes of rectangles 
sort(rectangles) // from top-left to bottom-right 
foreach (rect in rectangles) 
    if (distance between two adjacent rectangles changed) 
     get number of grown/shrunk rows/columns 
     foreach (rect2 in rectangles below/to the right of rect) 
      move rect2 according to the grown/shrunk rows 
      if collision is solved after vertical movement 
       continue 
      else 
       move horizontally 

將該溶液在情況2發生故障時,因爲小藍色矩形的相對距離發生變化,但其大小不被改變。底部兩個矩形之間的距離將不爲0.

+0

*「這將是完美的,如果相對位置/兩個矩形之間的距離不是在某些情況下,改變」 * - 我認爲你真的需要澄清的意思'相對位置'和'一些案例',以獲得有用的答案。 –

回答

0

我已經嘗試了幾種方法(我已經考慮過這個問題約一個多月),我發現下面的方法可能會更好。 我想我們必須知道矩形之間的關係(它們是如何分組的),以便使重新定位的矩形在視覺上類似於以前的版本。

// Use 2D array to represent the 2D space 
ConstructRectangleGroups() 
foreach (item in array) // item is the pixel in 2D space 
    if (item contains more than 1 rectangles) // has collision 
     foreach (rect in item's rectangles) 
      get number of rect's grown/shrunk rows/columns 
      foreach (rect2 in rectangleGroups[rectangleGroups.FindIndex(rect)]) 
       move rect2 according to the grown/shrunk rows 
       if collision is solved after vertical movement 
        continue 
       else 
        move horizontally 

ConstructRectangleGroups()是

rectangleGroups = [][] 
foreach (item in array) 
    if (item has rectangle) 
     closestRectangles = rectangle.GetClosestRectangles() 
     // A rectangle is isolated if the distance between adjacent rectangle > MaxDistance 
     // In this case, closestRectangles will be empty. 
     if (closestRectangles.Count > 0) 
      foreach (closestRectangle in closestRectangles) 
       if (closestRectangle.ClosestRectangle != rectangle) 
        rectangle.ClosestRectangle = closestRectangle 
      if (rectangle.closestRectangle == null) 
       rectangle.ClosestRectangle = closestRectangles[0] 
foreach (rect in rectangles) 
    if (rect.ClosestRectangle == null) 
     rectangleGroups.Add(new [] { rect }) 
    else 
     index = rectangle.FindIndex(rect) 
     if (index < 0) 
      rectangleGroups.Add(new [] { rect }) 
     else 
      rectangleGroups[index].Add(rect.ClosestRectangle)