{"version":3,"sources":["https://lively-kernel.org/lively4/BP2019RH-stable/src/internal/individuals-as-points/venn/force-center-layouter.js"],"names":["generateUUID","getRandomInteger","d3","ForceCenterLayouter","constructor","canvasWidth","canvasHeight","vennDiagramm","graph","nodes","links","forceCenters","undefined","layoutForceCenters","_resetGraph","_buildForceNodes","_buildForceCenterConnections","_layout","_updateForceCenterAnnotationCoordinates","setCanvasExtent","newCanvasWidth","newCanvasHeight","_addForceCentersToGraph","forEach","forceCenter","_buildLinksForForceCenter","initialForceCenterThemeGroups","themeGroups","allOtherForceCenters","filter","otherForceCenter","uuid","_forceCenterDeservesLink","_addLink","notIntersectionEmpty","_themeGroupIntersectionIsNotEmpty","otherForceCenterHasLessThemeGroups","_otherForceCenterHasLessThemeGroups","forceCenterThemeGroups","otherForceCenterThemegroups","themeGroupIntersection","themeGroup","includes","length","otherForceCenterThemeGroups","push","source","target","Promise","resolve","simulation","forceSimulation","force","forceLink","distance","strength","id","d","forceManyBody","alphaDecay","x","y","on","_tickActions","alphaTarget","restart","node","radius","Math","max","min","_randomizePositions","updatePosition","updateAnnotationCoordinates"],"mappings":"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","file":"force-center-layouter.js","sourcesContent":["import { generateUUID, getRandomInteger } from '../common/utils.js'\n\nimport d3 from \"src/external/d3.v5.js\";\n\nexport default class ForceCenterLayouter {\n  \n  constructor(canvasWidth, canvasHeight, vennDiagramm) {\n    this.vennDiagramm = vennDiagramm\n    this.canvasWidth = canvasWidth\n    this.canvasHeight = canvasHeight\n    this.graph = {\n      nodes: [],\n      links: []\n    }\n    this.forceCenters = undefined\n  }\n  \n  // ------------------------------------------\n  // Public Methods\n  // ------------------------------------------\n  \n  async layoutForceCenters(forceCenters) {\n    this.forceCenters = forceCenters\n    this._resetGraph()\n    this._buildForceNodes()\n    this._buildForceCenterConnections()\n    await this._layout()\n    //this._randomizePositions(this.forceCenters)\n    this._updateForceCenterAnnotationCoordinates()\n  }\n  \n  setCanvasExtent(newCanvasWidth, newCanvasHeight) {\n    this.canvasWidth = newCanvasWidth\n    this.canvasHeight = newCanvasHeight\n  }\n  \n  // ------------------------------------------\n  // Private Methods\n  // ------------------------------------------\n  \n  _resetGraph() {\n    this.graph = {\n      nodes: [],\n      links: []\n    }\n  }\n  \n  _buildForceNodes() {\n    this._addForceCentersToGraph()\n  }\n  \n  _buildForceCenterConnections() {\n    this.forceCenters.forEach( forceCenter => {\n      this._buildLinksForForceCenter(forceCenter)\n    })\n  }\n  \n  _buildLinksForForceCenter(forceCenter) {\n    let initialForceCenterThemeGroups = forceCenter.themeGroups\n    let allOtherForceCenters = this.forceCenters.filter( otherForceCenter => { return otherForceCenter.uuid != forceCenter.uuid })\n    allOtherForceCenters.forEach( otherForceCenter => {\n      if(this._forceCenterDeservesLink(forceCenter, otherForceCenter)) {\n        this._addLink(forceCenter, otherForceCenter)\n      }\n    })\n  }\n  \n  _forceCenterDeservesLink(forceCenter, otherForceCenter) {\n    let notIntersectionEmpty = this._themeGroupIntersectionIsNotEmpty(forceCenter.themeGroups, otherForceCenter.themeGroups)\n    let otherForceCenterHasLessThemeGroups = this._otherForceCenterHasLessThemeGroups(forceCenter.themeGroups, otherForceCenter.themeGroups)\n    \n    return notIntersectionEmpty && otherForceCenterHasLessThemeGroups\n  }\n  \n   _themeGroupIntersectionIsNotEmpty(forceCenterThemeGroups, otherForceCenterThemegroups) {\n    let themeGroupIntersection = forceCenterThemeGroups.filter(themeGroup => otherForceCenterThemegroups.includes(themeGroup))\n    return themeGroupIntersection.length !== 0\n  }\n  \n  _otherForceCenterHasLessThemeGroups(forceCenterThemeGroups, otherForceCenterThemeGroups) {\n    return forceCenterThemeGroups.length < otherForceCenterThemeGroups.length\n  }\n  \n  _addLink(forceCenter, otherForceCenter) {\n    this.graph.links.push({source: forceCenter.uuid, target: otherForceCenter.uuid});\n  }\n  \n  _addForceCentersToGraph() {\n    this.forceCenters.forEach( forceCenter => {\n      forceCenter.uuid = generateUUID()\n      this.graph.nodes.push(forceCenter)\n    })\n  }\n  \n  _layout() {\n    return new Promise((resolve) => {\n      let simulation = d3.forceSimulation()\n        .force(\"link\", d3.forceLink().distance(70).strength(0.1).id(function(d) { return d.uuid; }))\n        .force(\"charge\", d3.forceManyBody().strength(function(d) { return -120;}))\n        .alphaDecay(0.03)\n        .force('center', d3.forceCenter().x(this.canvasWidth * .5).y(this.canvasHeight * .5))\n      \n      simulation.on('tick', () => {this._tickActions()})\n      \n      simulation.nodes(this.graph.nodes)\n      simulation.force(\"link\").links(this.graph.links);\n      simulation.alphaTarget(0).on(\"end\", () => resolve(this.graph)).restart(); \n      \n    });\n  }\n  \n  _tickActions() {\n    this.graph.nodes.forEach( node => {\n      let radius = 30\n      node.x = Math.max(radius, Math.min(this.canvasWidth  - radius, node.x))\n      node.y = Math.max(radius, Math.min(this.canvasHeight - radius, node.y))\n    })\n  } \n\n  _randomizePositions(forceCenters) {\n    forceCenters.forEach(forceCenter => {\n      let x = getRandomInteger(0, 1000)\n      let y = getRandomInteger(0, 600)\n      forceCenter.updatePosition(x, y)\n    })\n  }\n  \n  _updateForceCenterAnnotationCoordinates() {\n    this.forceCenters.forEach( forceCenter => {\n      forceCenter.updateAnnotationCoordinates()\n    })\n  }\n}"]}