【问题标题】:Splitting square div in to n smaller divs algorithm将方形 div 拆分为 n 个较小的 div 算法
【发布时间】:2018-03-09 07:52:10
【问题描述】:

我有一个方形容器div,其中width & height 设置为200px。我将收到一个number (e.g. 3, 10, 20, 30) 并需要在container div 内创建该数量的矩形或正方形divs 以填充空间。

问题:

假设它们之间没有额外的空间(边距和填充),我如何找到这些内部 divswidth & height?理想情况下,它们应该尽可能接近正方形。

示例:

如果数字是 100,那么内部的宽度和高度将是 20px,相当简单。如果数字为 3,则内部宽度可以为 33%,高度可以为 100%,反之亦然。

【问题讨论】:

  • 我不明白你的例子。如果你有一个 200x200 的容器,你可以在里面放 400 个 10x10 的盒子,而不是 20 个。要放 20 个,它们应该是 40x50 或类似的东西。还是我误解了什么?
  • @SaiBot 你是对的。我编辑了示例

标签: javascript css algorithm geometry packing


【解决方案1】:

我认为这个想法是找到彼此尽可能接近的一对除数(互补除数)。换句话说,这将是具有最小和的除数对。

对于 3,这将是 1 和 3。

20 可以通过对 1×20、2×10、4×5(和对称)相乘来获得。最接近的除数(或除数之和)的对是 4x5。

对于 30(1x30、2x15、3x10 和 5×6),您将获得 5x6。

一旦你有了这对除数,你就知道如何堆叠盒子并且可以计算每个盒子的宽度和高度。

例如,对于 30,您将希望有 5 行和 6 列的框(或相反)。所以你将 200 除以 5 得到一个盒子的高度,然后 200 除以 6 得到 witdh。

最后你可能不得不四舍五入到像素。

【讨论】:

  • 在一些早期的实验中,这似乎是非常正确的目标!
【解决方案2】:

你需要在这里做两个主要的条件。

首先:如果数字是奇数,则只需将 200 除以收到的数字,并将其定义为每个矩形的宽度(奇数不能在每行有相同数量的 div,所以你不能多于 1 行)。

第二:否则,将给定的数字除以 2,直到它是奇数或等于 2。您可以为此使用 while 循环:

while (n % 2 == 0 && n !== 2) { 
    n = n / 2;
    numRows = numRows * 2;
    numColumns = n
}

其中“n”是给定的数字,“numRows”和“numColumns”是声明的变量。

这将为您提供所需的行数和每行所需的列数。从这里您将行数除以 200,将列数除以 200,以获得每个单独块的宽度和高度。

我希望我的逻辑是合理的,这很有帮助。

【讨论】:

  • 奇数的事实在这里没有任何作用。为了适应 9 个内部 div,您应该选择宽度和高度均为 33%,即 3 行和 3 列
【解决方案3】:

首先你必须使用Math.sqrt() % 1 === 0 jQuery 找到添加的div 数字是否为正方形...如果是正方形,则通过将100% 除以该数字的平方根...

如果数字不是平方数,则只需将100% 除以 div 数即可计算出width

堆栈片段

$(document).on("click", "#click", function() {
  var n = $("#input").val();
  var sqrtNo = Math.sqrt(n);
  $(".parent").html("");
  for (var i = 0; i < n; i++) {
    $(".parent").append("<div class='child'></div>");
  }
  if (sqrtNo % 1 === 0) {
    $(".child").css({
      "width": (100 / sqrtNo) + "%",
      "height": (100 / sqrtNo) + "%"
    });
  } else {
    $(".child").css({
      "width": (100 / n) + "%"
    });
  }
})
.parent {
  height: 200px;
  width: 200px;
  background: red;
  display: flex;
  margin: 10px 0;
  flex-wrap: wrap;
}

.child {
  background: yellow;
  border: 1px solid red;
  box-sizing: border-box;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="input" placeholder="Enter no of divs">
<input type="button" id="click" value="click">
<div class="parent"></div>

【讨论】:

  • “理想情况下,它们应该尽可能接近正方形。”
  • @Paulie_D 但OP也说If the number is 3, the inner width could be 33% and the height could be 100%
  • ..但如果有 9 个,则应该有 9 个 方格,这就是为什么这很难。
  • 是的@Paulie_D 是正确的。例如,如果接收到的数字是 4、9、16,那么内部 div 将都是正方形。你可以像做 bhuwan 一样不断地切割宽度,但我想尽可能地保持宽度和高度。
  • @drdo 我用一些额外的代码和解释更新了我的答案......看看
猜你喜欢
  • 2011-06-22
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 2012-01-19
  • 2020-08-31
相关资源
最近更新 更多