网格中的 d3 个正方形

d3 squares in a grid

我正在尝试理解 Mike Bostok 的方形网格:https://bl.ocks.org/mbostock/1009139

我想知道他是如何放置单元格位置的,我想下面的部分说明了这一点。但是我不能确定它是什么意思。

.attr("x", function(i) {
        var x0 = Math.floor(i / 100) % 10, x1 = Math.floor(i % 10);
        return groupSpacing * x0 + (cellSpacing + cellSize) * (x1 + x0 * 10);
      })
.attr("y", function(i) {
        var y0 = Math.floor(i / 1000), y1 = Math.floor(i % 100 / 10);
        return groupSpacing * y0 + (cellSpacing + cellSize) * (y1 + y0 * 10);
      })

你能帮我理解这部分吗?基本上,如何设置网格中单元格的位置。就我而言,我想根据数据中变量的比例来设置位置。但一些常识也会有很大帮助。

另外,最难的是%的用法。谁能告诉我为什么需要它?

非常感谢,

让我们将其分解为 x。首先,i 是单元格的索引。它将从 0 .. N 开始,其中 N 是单元格数减去 1。

var x0 = Math.floor(i / 100) % 10

x0 是单元格所在的 10x10 组的 x 位置。由于每个组包含 100 个单元格,因此它是索引的底部除以 100。因此,考虑单元格 201,这将是2,这是正确的。但是,您需要模运算(returns 除法的其余部分)以在 10 组之后换行。考虑单元格 2001,floor(2001/100) 将置于 20,尽管将模数放入,但 x 位置正确为 0。

x1 = Math.floor(i % 10)

x1 是 10x10 组中的 x 位置。这是除以 10 的余数的下限。10 是因为我们在每个组中有 10 列。同样,如果您检查我们对 201 和 2001 的测试,它们都正确地出现在第二列中。

最后的综合排名:

groupSpacing * x0 + (cellSpacing + cellSize) * (x1 + x0 * 10);

上面写着(pixel group spacing * x0) + (pixel cell spacing + pixel cell size) * ((x0 * 10) + x1)

  1. 每组的像素间距
  2. 每个单元格的单元格大小和间距
  3. x组位置*10(因为每组10列)
  4. 加上每组的位置