layoutChildren static method

List<Row> layoutChildren(
  1. num ratio,
  2. TreeMapNode parent,
  3. double left,
  4. double top,
  5. double right,
  6. double bottom,
)

Implementation

static List<Row> layoutChildren(num ratio, TreeMapNode parent, double left, double top, double right, double bottom) {
  List<Row> rows = [];
  List<TreeMapNode> nodes = parent.children;
  num value = parent.value;

  num minValue;
  num maxValue;
  double newRatio;
  double minRatio;
  double alpha;
  double beta;

  int i0 = 0;
  int i1 = 0;
  int n = nodes.length;
  num nodeValue;
  double dx;
  double dy;
  num sumValue;
  while (i0 < n) {
    dx = right - left;
    dy = bottom - top;
    // 找到下一个非空的数据
    do {
      sumValue = nodes[i1++].value;
    } while (sumValue == 0 && i1 < n);

    minValue = maxValue = sumValue;

    alpha = m.max(dy / dx, dx / dy) / (value * ratio);
    beta = sumValue * sumValue * alpha;
    minRatio = m.max(maxValue / beta, beta / minValue);
    // 保持纵横比的同时继续添加节点
    for (; i1 < n; ++i1) {
      nodeValue = nodes[i1].value;
      sumValue += nodeValue;

      if (nodeValue < minValue) {
        minValue = nodeValue;
      }
      if (nodeValue > maxValue) {
        maxValue = nodeValue;
      }
      beta = sumValue * sumValue * alpha;
      newRatio = m.max(maxValue / beta, beta / minValue);
      if (newRatio > minRatio) {
        sumValue -= nodeValue;
        break;
      }
      minRatio = newRatio;
    }
    // 定位并记录行方向
    Row row = Row(sumValue, dx < dy, nodes.sublist(i0, i1));
    rows.add(row);
    if (row.dice) {
      treemapDice(row, left, top, right, isTrue(value) ? (top += (dy * sumValue / value)) : bottom);
    } else {
      treemapSlice(row, left, top, isTrue(value) ? left += (dx * sumValue / value) : right, bottom);
    }
    value -= sumValue;
    i0 = i1;
  }
  return rows;
}