index.html 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <head>
  2. <style> body { margin: 0; } </style>
  3. <script src="//unpkg.com/3d-force-graph"></script>
  4. <!--<script src="../../dist/3d-force-graph.js"></script>-->
  5. </head>
  6. <body>
  7. <div id="3d-graph"></div>
  8. <script>
  9. // Random tree
  10. const N = 80;
  11. const gData = {
  12. nodes: [...Array(N).keys()].map(i => ({ id: i })),
  13. links: [...Array(N).keys()]
  14. .filter(id => id)
  15. .map(id => ({
  16. source: id,
  17. target: Math.round(Math.random() * (id-1))
  18. }))
  19. };
  20. // cross-link node objects
  21. gData.links.forEach(link => {
  22. const a = gData.nodes[link.source];
  23. const b = gData.nodes[link.target];
  24. !a.neighbors && (a.neighbors = []);
  25. !b.neighbors && (b.neighbors = []);
  26. a.neighbors.push(b);
  27. b.neighbors.push(a);
  28. !a.links && (a.links = []);
  29. !b.links && (b.links = []);
  30. a.links.push(link);
  31. b.links.push(link);
  32. });
  33. const highlightNodes = new Set();
  34. const highlightLinks = new Set();
  35. let hoverNode = null;
  36. const Graph = ForceGraph3D()
  37. (document.getElementById('3d-graph'))
  38. .graphData(gData)
  39. .nodeColor(node => highlightNodes.has(node) ? node === hoverNode ? 'rgb(255,0,0,1)' : 'rgba(255,160,0,0.8)' : 'rgba(0,255,255,0.6)')
  40. .linkWidth(link => highlightLinks.has(link) ? 4 : 1)
  41. .linkDirectionalParticles(link => highlightLinks.has(link) ? 4 : 0)
  42. .linkDirectionalParticleWidth(4)
  43. .onNodeHover(node => {
  44. // no state change
  45. if ((!node && !highlightNodes.size) || (node && hoverNode === node)) return;
  46. highlightNodes.clear();
  47. highlightLinks.clear();
  48. if (node) {
  49. highlightNodes.add(node);
  50. node.neighbors.forEach(neighbor => highlightNodes.add(neighbor));
  51. node.links.forEach(link => highlightLinks.add(link));
  52. }
  53. hoverNode = node || null;
  54. updateHighlight();
  55. })
  56. .onLinkHover(link => {
  57. highlightNodes.clear();
  58. highlightLinks.clear();
  59. if (link) {
  60. highlightLinks.add(link);
  61. highlightNodes.add(link.source);
  62. highlightNodes.add(link.target);
  63. }
  64. updateHighlight();
  65. });
  66. function updateHighlight() {
  67. // trigger update of highlighted objects in scene
  68. Graph
  69. .nodeColor(Graph.nodeColor())
  70. .linkWidth(Graph.linkWidth())
  71. .linkDirectionalParticles(Graph.linkDirectionalParticles());
  72. }
  73. </script>
  74. </body>