JavaScript计算无冲突div的随机位置

ifsvaxew  于 2023-01-16  发布在  Java
关注(0)|答案(1)|浏览(124)

我试图在容器中画出一堆div,使它们在每次页面加载时随机放置,并且没有重叠。我似乎陷入了一个无限循环,在页面崩溃之前没有在Chrome中加载源代码,我无法正确调试。
下面是我的代码:

$(document).ready(function() {
  var filledAreas = new Array();

  var minX = 50;
  var maxX = $("#banner").width() - 150;
  var minY = 50;
  var maxY = $("#banner").height() - 150;

  var loops = 0;
  var loopsMax = 100;

  for (var i = 0; i < 15; i++) {
    var color = '#' + Math.round(0xffffff * Math.random()).toString(16);
    $newDiv = $("<div class='bubble-outer'></div>").css({
      'width': '100px',
      'height': '100px',
      'background-color': color,
    });
    var randX = 0;
    var randY = 0;
    var area;
    do {
      randX = Math.floor(Math.random() * (maxX - minX + 1)) + minX;
      randY = Math.floor(Math.random() * (maxY - minY + 1)) + minY;
      var area = {
        'left': randX,
        'top': randY,
        'right': randX + 100,
        'bottom': randY + 100,
      };
    } while (loops < loopsMax && checkOverlap(area))

    filledAreas.push(area)

    $newDiv.css({
      'position': 'absolute',
      'left': randX + 'px',
      'top': randY + 'px',
      'display': 'none'
    }).delay(1000).appendTo("#banner").fadeIn(300);
  }

  console.log("Loops: " + loops);

  function checkOverlap(area) {
    for (var i = 0; i < filledAreas.length; i++) {
      var check = filledAreas[i];
      if (area.right < check.left && area.bottom < check.top &&
        check.right < area.left && check.bottom < area.top) {
        loops++;
        continue;
      } else {
        return true;
      }
      return false;
    }
  }
});
lp0sw83n

lp0sw83n1#

既然你用了我的算法,不妨把它贴出来作为答案!
和许多事情一样,欺骗比完全做你想做的事情更容易。
用“正确”的方法来做会涉及到检测碰撞,这会变得非常棘手非常快。
然而,这里有一个很好的作弊方法:
1.将区域划分为一个网格。每个网格方块必须至少和你最大的元素一样大,这样才能正确工作。
1.为每个元素选择一个方格,如果那个方格还没有被选上,就把你的元素随机地放在方格里面。
就是这样!现在你可以保证永远不会有任何碰撞,它看起来很随机,因为它是:)

相关问题