2013-10-28 47 views
3

本質上,我正在做的是將一束隨機的寬度/高度矩形放置到網格上(靠近它的中心),然後將它們全部從彼此推開,直到它們沒有重疊。我有另一個版本,在將它們放置在網格上之前檢查是否存在碰撞,但這不是我在這個版本中要做的。分離真理Javascript

我想知道是否有人可以解釋一個更好的方法來解決這個問題?

我到目前爲止已經試過類似的東西:

讓R1/R2 = Rect1的/ RECT2

do { 
    var ox = Math.max(0, Math.min(r1.x + r1.w, r2.x + r2.w) - Math.max(r1.x, r2.x)), 
     oy = Math.max(0, Math.min(r1.y + r1.h, r2.y + r2.h) - Math.max(r1.y, r2.y)), 
     dx = r2.x - r1.x, 
     dy = r2.y - r1.y; 
    if (ox > 0 && oy > 0) { 
     if (ox >= oy) { 
      if (r1.x >= r2.x && Math.random() > .1) { 
       r1.x += ox; 
       spaced = true; 
       continue; 
      } else { 
       r1.x -= ox; 
       spaced = true; 
       continue; 
      } 
     } else { 
      if (r1.y >= r2.y && Math.random() > .1) { 
       r1.y += oy; 
       spaced = true; 
       continue; 
      } else { 
       r1.y -= oy; 
       spaced = true; 
       continue; 
      } 
     } 
    } 
} while (/* stuff */) 

隨機只那裏,因爲我將運行到時候一定RECT被來回推動,永遠不會自由並導致無限循環。然而,這種方式效率非常低。

+0

那麼你的問題是什麼?你在尋找更高效的算法嗎?你想知道爲什麼沒有隨機你會得到一個無限循環?現在不清楚你在問什麼。 – Ryan

+0

對,對不起。想知道是否有人可以解釋一個更好的方法來做到這一點,或者讓我找到更好的解決方案 –

+0

TL:DR--它是否需要最終成爲「電網」?還是你想盡可能緊密地安排rects? – slebetman

回答

0

我相信你試圖完成的事情被稱爲包裝問題http://en.wikipedia.org/wiki/Packing_problem。如果你只是搜索堆棧溢出「2d bin packing」,你應該能夠找到所有你需要的滾動更高效的算法。