overlap: function()

in src/core/distributor.js [68:132]


    overlap: function(nodes){
      var layers = [];
      var maxWidth = distributor.maxWidthPerLayer();

      var puntedNodes = nodes.concat();
      var puntedWidth = distributor.computeRequiredWidth(puntedNodes);

      while(puntedWidth > maxWidth){
        distributor.countIdealOverlaps(puntedNodes);

        var nodesInCurrentLayer = puntedNodes.concat();
        var currentlayerWidth = puntedWidth;
        puntedNodes = [];

        while(nodesInCurrentLayer.length > 2 && currentlayerWidth > maxWidth){
          // Sort by overlaps
          nodesInCurrentLayer.sort(function(a,b){
            return b.overlapCount - a.overlapCount;
          });

          // Remove the node with most overlap
          var first = nodesInCurrentLayer.shift();

          // Update width
          currentlayerWidth -= first.width;
          currentlayerWidth += options.stubWidth;

          // Update overlap count for the remaining nodes
          first.overlaps.forEach(function(node){
            node.overlapCount--;
          });

          // Add removed node to the next layer
          puntedNodes.push(first);
        }

        layers.push(nodesInCurrentLayer);

        puntedWidth = distributor.computeRequiredWidth(puntedNodes);
      }

      if(puntedNodes.length>0){
        layers.push(puntedNodes);
      }

      // Create stubs
      // From last layer
      for(var i=layers.length-1; i>=1; i--){
        var layer = layers[i];
        // For each node in the layer
        for(var k=0; k<layer.length; k++){
          var node = layer[k];
          // If it is not a stub
          if(node.isStub()) continue;
          // Create one stub for each layer above it
          var stub = node;
          for(var j=i-1;j>=0;j--){
            stub = stub.createStub(options.stubWidth);
            layers[j].push(stub);
          }
        }
      }

      return layers;
    }