{"version":3,"sources":["https://lively-kernel.org/lively4/BP2019RH1/scratch/venn-source/packStrategies.js"],"names":["SMALL","containedInCircles","distance","binder","applier","outOfCircles","point","circles","i","length","radius","pack","layout","packingConfig","sets","forEach","k","set","innerRadius","center","children","nodes","x","y","d3","size","n","distribute","queue","maxAttempt","inCircles","outCircles","indexOf","push","map","attempt","candidate","Math","random","s","a","PI","r","sqrt","p","cos","sin","console","warn","force","data","packer","padding","maxRadius","collider","ticker","ender","starter","links","gravity","charge","on","init","tick","e","d","get","__setKey__","alpha","collide","quadtree","geom","nx1","nx2","ny1","ny2","visit","quad","x1","y1","x2","y2","l"],"mappings":"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","file":"packStrategies.js","sourcesContent":["/*\nlib for node packing algorithm\n*/\nimport {\n  SMALL,\n  containedInCircles,\n  distance\n}\nfrom \"../venn.js/src/circleintersection.js\";\nimport {\n  binder,\n  applier\n}\nfrom \"./getSet.js\";\n\n\n//return true when the point is out of all circles\nfunction outOfCircles(point, circles) {\n  for (var i = 0; i < circles.length; ++i) {\n    if (distance(point, circles[i]) < circles[i].radius + SMALL) {\n      return false;\n    }\n  }\n  return true;\n}\n\n\n// function called from d3.layout.venn \n// used to pack child nodes insiside inner circle of a venn set.\nfunction pack(layout) {\n  // var valueFn = layout.value();\n  var packingConfig = layout.packingConfig();\n\n  layout.sets().forEach(function(k,set) {\n    // function pack(set, valueFn) {\n    var innerRadius = set.innerRadius,\n      center = set.center,\n      children = set.nodes,\n      x = center.x - innerRadius,\n      y = center.y - innerRadius;\n\n    applier(d3.layout.pack(), packingConfig)\n      .size([innerRadius * 2, innerRadius * 2])\n      .nodes({\n        children: children\n      });\n    // translate the notes to the center    \n    if (children) {\n      children.forEach(function(n) {\n        n.x += x;\n        n.y += y;\n      });\n    }\n  })\n}\n\n// function called from d3.layout.venn \n// used to randomly distribute child nodes insiside a venn set.\n// d3.layout.venn.packCircles looks prettier.\nfunction distribute(layout) {\n  // var valueFn = layout.value(),\n  var circles = layout.circles();\n\n  layout.sets().forEach(function(k,set) {\n    var queue = [],\n      maxAttempt = 500,\n      k,\n      inCircles = [],\n      outCircles = [],\n      center = set.center,\n      innerRadius = set.innerRadius;\n\n\n    for (k in circles) {\n      if (set.sets.indexOf(k) > -1) {\n        inCircles.push(circles[k])\n      } else {\n        outCircles.push(circles[k])\n      }\n    }\n\n    // distanceToCircles.set(set.__key, computeDistanceToCircles(set))\n    set.nodes.map(function(n, i) {\n      var attempt = 0,\n        candidate = null;\n\n      if (i == 0) { // first node centered\n        n.x = center.x;\n        n.y = center.y;\n        queue.push(n)\n      } else {\n        while (!candidate && (attempt < maxAttempt)) {\n          var i = Math.random() * queue.length | 0,\n            s = queue[i],\n            a = 2 * Math.PI * Math.random(),\n            r = Math.sqrt(Math.random() * ((innerRadius * innerRadius) + (10 * 10))),\n            p = {\n              x: s.x + r * Math.cos(a),\n              y: s.y + r * Math.sin(a)\n            };\n          attempt++;\n          if (containedInCircles(p, inCircles) && (outOfCircles(p, outCircles))) {\n            candidate = p;\n            queue.push(p)\n          }\n\n        }\n        if (!candidate) {\n          console.warn('NO CANDIDATE')\n          candidate = {\n            x: center.x,\n            y: center.y\n          }\n        }\n        n.x = candidate.x;\n        n.y = candidate.y;\n\n        // nodes.push(n);\n      }\n    });\n  })\n}\n\n// apply a d3.fore layout with foci on venn area center to set foci\n// d3.layout.venn.packCircles looks prettier.\nfunction force(layout, data) {\n\n  var force = layout.packer()\n  if (!force) {\n    force = d3.layout.force();\n    binder(force, {\n    \tpadding : 3,\n    \tmaxRadius : 8,\n      collider : true,\n      ticker: null,\n      ender : null,\n      starter : null\n    });\n  }\n\n  var packingConfig = layout.packingConfig(),\n    size = layout.size(),\n    sets = layout.sets(),\n   \n    padding = force.padding(), // separation between nodes\n    maxRadius = force.maxRadius(),\n    collider = force.collider;\n  // foci = d3.map({}, function(d) {\n  //   return d.__key__\n  // });\n\n  // layout.sets().forEach(function(set) {\n  //   foci.set(set.__key__, set.center);\n  // })\n\n  applier(force, packingConfig)\n    .nodes(data)\n    .links([])\n    .gravity(0)\n    .charge(0)\n    .size(size)\n    .on('start', init)\n    .on('tick', tick)\n    \n  var ender ;\n  if(ender = force.ender()) {\n\t\tforce.on('end', ender)\n  }  \n    \n  function init(e) {\n    data.forEach(function(d) {\n    \tvar center = sets.get(d.__setKey__).center;\n      d.x = d.x ? d.x * 1 : center.x;\n      d.y = d.y ? d.y * 1 : center.y;\n    })\n    var starter ;\n    if(starter = force.starter()) {\n\t\t\tstarter(layout)\n    }\n  }\n\n  function tick(e) {\n    var ticker;\n    data\n      .forEach(gravity(.2 * e.alpha))\n    \n     if(collider) {\n     data\n    \t \t.forEach(collide(.5))\n\t\t}\n    if (ticker = force.ticker()) {\n      ticker(layout)\n    }\n  }\n    // Move nodes toward cluster focus.\n    function gravity(alpha) {\n      return function(d) {\n        var center = sets.get(d.__setKey__).center;\n        d.y += (center.y - d.y) * alpha;\n        d.x += (center.x - d.x) * alpha;\n     };\n    }\n    // Resolve collisions between nodes.\n    function collide(alpha) {\n      var  quadtree = d3.geom.quadtree(data);\n      return function(d) {\n        var r = d.r + maxRadius + padding,\n          nx1 = d.x - r,\n          nx2 = d.x + r,\n          ny1 = d.y - r,\n          ny2 = d.y + r;\n        quadtree.visit(function(quad, x1, y1, x2, y2) {\n          if (quad.point && (quad.point !== d)) {\n            var x = d.x - quad.point.x,\n              y = d.y - quad.point.y,\n              l = Math.sqrt(x * x + y * y),\n              r = d.r + quad.point.r + (d.__setKey__ !== quad.point.__setKey__) * padding;\n            if (l < r) {\n              l = (l - r) / l * alpha;\n              d.x -= x *= l;\n              d.y -= y *= l;\n              quad.point.x += x;\n              quad.point.y += y;\n            }\n          }\n          return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;\n        });\n      };\n    }\n    return force;\n\n  }\n\n  export {\n    pack, distribute, force\n  }\n"]}