verticalAlignment method

void verticalAlignment(
  1. Map<Node?, Node?> root,
  2. Map<Node?, Node?> align,
  3. Map<int, int> type1Conflicts,
  4. bool downward,
  5. bool leftToRight,
)

Implementation

void verticalAlignment(Map<Node?, Node?> root, Map<Node?, Node?> align, Map<int,int> type1Conflicts,
    bool downward, bool leftToRight) {
  // for all Level;

  var layersa = downward ? layers : layers.reversed;

  for (var layer in layersa) {
    // As with layers, we need a reversed iterator for blocks for different directions
    var nodes = leftToRight ? layer : layer.reversed;
    // Do an initial placement for all blocks
    var r = leftToRight ? -1 : double.infinity;
    for (var v in nodes) {
      final adjNodes = getAdjNodes(v, downward);
      if (adjNodes.isNotEmpty) {
        var midLevelValue = adjNodes.length / 2;
        // Calculate medians
        final medians = adjNodes.length % 2 == 1
            ? [adjNodes[midLevelValue.floor()]]
            : [adjNodes[midLevelValue.toInt() - 1], adjNodes[midLevelValue.toInt()]];

        // For all median neighbours in direction of H
        for (var m in medians) {
          final posM = positionOfNode(m);
          // if segment (u,v) not marked by type1 conflicts AND ...;
          if (align[v] == v &&
              type1Conflicts[positionOfNode(v)] != posM &&
              (leftToRight ? r < posM : r > posM)) {
            align[m] = v;
            root[v] = root[m];
            align[v] = root[v];
            r = posM;
          }
        }
      }
    }
  }
}