【问题标题】:Place divs random without overlaying随机放置 div 而不叠加
【发布时间】:2011-06-13 05:20:27
【问题描述】:

我想在窗口上随机放置 div 而不叠加。因此我 创建一些数组,用

widthArray, heightArray, xP = xPosition, yP = yPosition, xPRT = rightCornerX(xPos + width), yPRT = rightCornerY 等

所以我给他们一个随机的位置,我计算所有的角点。 之后,如果一个 div 的角之一在里面,我会在两个循环内计算 另一个 div,如果这是真的,我会给出一个新的随机位置,只要它确实如此 不与另一个 div 重叠。

代码如下:

for(var i = 0; i<xP.length; i++) {  
            for(var k = 0; k<xP.length; k++) {

                if(i == k) {
                    //alert(Math.random());
                } else {

                    while((xP[i]>xP[k] && yP[i]>yP[k] && xP[i]<xPRB[k] && yP[i]<yPRB[k]) || (xPRT[i]<xPRT[k] && yPRT[i]>yPRT[k] && xPRT[i]>xP[k] && yPRT[i]<yPRB[k]) || (xPRB[i]<xPRB[k] && yPRB[i]<yPRB[k] && xPRB[i]>xP[k] && yPRB[i]>yP[i]) || (xPLB[i]>xPLB[k] && yPLB[i]<yPLB[k] && xPLB[i]<xPRB[k] && yPLB[i]>yP[k])) {
                        //alert("i: "+i+" k: "+k+" xP: "+xP[i]+" > xP2: "+xP[k]+" & yP: "+yP[i]+"  > yP2: "+yP[k]);
                        xP[i] = GetRandom(0, window.innerWidth - widthArray[i]-2);
                        yP[i] = GetRandom(0, window.innerHeight - heightArray[i]-2);

                        xPRT[i] = xP[i] + widthArray[i];
                        yPRT[i] = yP[i];

                        xPRB[i] = xP[i]+ widthArray[i];
                        yPRB[i] = yP[i]+ heightArray[i];

                        xPLB[i] = xP[i];
                        yPLB[i] = yP[i] + heightArray[i];
                        count++;

                    };
                }
            }
        }

之后,我用创建的变量定位 div。 但仍有覆盖的div。我的逻辑有问题还是 是不是写得不正确?

感谢您的帮助,抱歉英语不好:)

【问题讨论】:

  • 你能把示例页面放到 jsFiddle 中吗?

标签: javascript html random overlay


【解决方案1】:

如果您在将 DIV 冲突添加到窗口时检查它们,我认为该算法会运行得更快。与其随机调速然后检查是否有任何碰撞,不如随机计算每个 DIV 的位置,并在添加之前检查该位置是否发生碰撞。如果是,重新计算一个新位置并再次检查。我认为这将 big-O 从 N^2 减少到 N * log( N )。

编辑 - 这是一些示例代码:

function Rect( x, y, w, h )
{
  this.x = x;
  this.y = y;
  this.w = w;
  this.h = h;

  this.hitTest = function( x, y )
  {
    return( x >= this.x && x <= this.x + this.width &&
            y >= this.y && y <= this.t + this.height );
  }
}

var numDivs = 10;
var divList = new Array();

for( var i = 0 ; i < numDivs ; i++ )
{
  var doesOverlap = false;
  do
  {
    divList[i] = new Rect( Math.random() * ( window.innerWidth - 50 ), Math.random() * ( window.innherHeight - 50 ), 50, 50 );
    for( var y = 0 ; y < i && !doesOverlap ; y++ )
    {
      doesOverlap |= divList[y].hitTest( divList[i].x, divList[i].y );
      doesOverlap |= divList[y].hitTest( divList[i].x + divList[i].width, divList[i].y );
      doesOverlap |= divList[y].hitTest( divList[i].x, divList[i].y + divList[i].height );
      doesOverlap |= divList[y].hitTest( divList[i].x + divList[i].width, divList[i].y + divList[i].height );
    }
  }
  while( doesOverlap );

  // No colision, add div
}

我没有测试它的正确性,只是把它写在我的脑海里。希望它能让您知道哪里出错了。

【讨论】:

  • 是的,但性能还没有问题。问题是,仍然有重叠的 div。我不知道为什么,因为我检查了计算一千次,我找不到任何错误:(
  • 我的建议也是解决您的问题的一种更简单的方法,如果您需要调试它,它会很容易一步一步完成。提高速度和简单性,没有比这更好的了。
  • 好的。我试过了。但如果我这样做,仍然有覆盖的 div。我真的不知道为什么。
猜你喜欢
  • 2015-02-28
  • 1970-01-01
  • 2012-07-03
  • 2018-06-30
  • 2013-08-06
  • 2016-05-01
  • 1970-01-01
相关资源
最近更新 更多