|
|
- let graph = {
- nodes : [
- {id : "hemp", index: 0, x: 719.1790913580512, y: 326.11409230900296, vy: 0.0009665554475078223, vx: 0.00044710537175425926},
- {id : "permapp", index: 1, x: 473.51321690437135, y: 317.1181430586339, vy: 0.0005811239352358496, vx: 0.0005105059544352408 },
- {id : "offgrid", index: 2, x: 495.66982580572676, y: 18.53, vy: 0.0007713356454593206, vx: 0.0007887999665437037 },
- {id : "cyberpreneur", index: 3, x: 457.9995206323447, y: 277.13445200140694, vy: 0.0004637678594351416, vx: 0.0007441570379881761 },
- {id : "kaoscube", index: 4, x: 428.05791236956037, y: 237.65121337678465, vy: 0.00037483669542696317, vx: 0.00039028860355878376 },
- {id : "spider", index: 5, x: 461.65464520161396, y: 189.18158017082138, vy: -0.00023265081878199873, vx: 0.00006278089396472572 }
-
- ],
-
- links : [
- {source: 0, target: 1, index: 0 },
- {source: 0, target: 2, index: 1 },
- {source: 0, target: 3, index: 2 },
- {source: 0, target: 4, index: 3 },
- {source: 1, target: 2, index: 4 },
- {source: 1, target: 4, index: 5 },
- {source: 2, target: 3 ,index: 6 },
- {source: 2, target: 4 ,index: 7 },
- {source: 2, target: 5 ,index: 8 },
- {source: 4, target: 5 ,index: 9 }
- ],
-
- }
-
- // mobile network
-
- let width = 100;
- let height = 200;
- let radius = 15;
-
- const svg = d3.select("#mobile_network").append("svg").attr("viewBox", "0, 0, 100, 200").attr("preserveAspectRatio", "xMidYMid meet"),
- link = svg
- .selectAll(".link")
- .data(graph.links)
- .join("line")
- .classed("link", true),
- node = svg
- .selectAll(".node")
- .data(graph.nodes)
- .join("circle")
- .attr("id", d => d.id)
- .attr("r", 15)
- .classed("node", true)
- .classed("fixed", d => d.fx !== undefined);
-
- const node1 = svg.select("#hemp")
- .attr("fill", "url(#imgHemp)")
- .append("a")
- .attr("xlink:href", "/hemp");
-
- const node2 = svg.select("#permapp")
- .attr("fill", "url(#imgPermapp)");
-
- const node3 = svg.select("#spider")
- .attr("fill", "url(#imgSpider)");
-
- const node4 = svg.select("#cyberpreneur")
- .attr("fill", "url(#imgCyber)");
-
- const node5 = svg.select("#kaoscube")
- .attr("fill", "url(#imgKaos)");
-
- const node6 = svg.select("#offgrid")
- .attr("fill", "url(#imgOff)");
-
- const defs = svg.append("svg:defs");
-
- defs.append("svg:pattern")
- .attr("width", "100%")
- .attr("height", "100%")
- .attr("id", "imgHemp")
- .append("svg:image")
- .attr("xlink:href", "/assets/img/hemp.webp")
- .attr("width", 45)
- .attr("height", 45)
- .attr("x", -7 )
- .attr("y", 0);
-
- defs.append("svg:pattern")
- .attr("width", "100%")
- .attr("height", "100%")
- .attr("id", "imgPermapp")
- .append("svg:image")
- .attr("xlink:href", "/assets/img/v1-permapp.webp")
- .attr("width", 35)
- .attr("height", 35)
- .attr("x", 0 )
- .attr("y", 0);
-
- defs.append("svg:pattern")
- .attr("width", "100%")
- .attr("height", "100%")
- .attr("id", "imgSpider")
- .append("svg:image")
- .attr("xlink:href", "/assets/img/spider_out.webp")
- .attr("width", 45)
- .attr("height", 45)
- .attr("x", -4 )
- .attr("y", -7);
-
- defs.append("svg:pattern")
- .attr("width", "100%")
- .attr("height", "100%")
- .attr("id", "imgCyber")
- .append("svg:image")
- .attr("xlink:href", "/assets/img/3d_greenhouse.webp")
- .attr("width", 50)
- .attr("height", 50)
- .attr("x", -5 )
- .attr("y", -10);
-
-
- defs.append("svg:pattern")
- .attr("width", "100%")
- .attr("height", "100%")
- .attr("id", "imgKaos")
- .append("svg:image")
- .attr("xlink:href", "/assets/img/cube_space.webp")
- .attr("width", 40)
- .attr("height", 40)
- .attr("x", -6 )
- .attr("y", -6);
-
- defs.append("svg:pattern")
- .attr("width", "100%")
- .attr("height", "100%")
- .attr("id", "imgOff")
- .append("svg:image")
- .attr("xlink:href", "/assets/img/boat_construction.webp")
- .attr("width", 40)
- .attr("height", 40)
- .attr("x", -5 )
- .attr("y", -6);
-
-
- const simulation = d3
- .forceSimulation()
- .nodes(graph.nodes)
- .force("charge", d3.forceManyBody().strength(-300))
- .force("center", d3.forceCenter(width / 2.5, height / 2.25))
- .force("link", d3.forceLink(graph.links).distance(30))
- .force("collide", d3.forceCollide(22))
- .force("x", d3.forceX(-30))
- .on("tick", tick);
-
-
- const drag = d3
- .drag()
- .on("start", dragstart)
- .on("drag", dragged);
-
- // invokes regiserd callback
- node.call(drag).on("click", click);
-
- function tick() {
- link
- .attr("x1", d => d.source.x)
- .attr("y1", d => d.source.y)
- .attr("x2", d => d.target.x)
- .attr("y2", d => d.target.y);
- node
- .attr("cx", d => d.x = Math.max(radius, Math.min(width - radius, d.x)))
- .attr("cy", d => d.y = Math.max(radius, Math.min(height - radius, d.y)));
- }
-
- // make this work on touch as well
-
- function click(event, d) {
- delete d.fx;
- delete d.fy;
- // remove fixed position on click
- d3.select(this).classed("fixed", false);
- simulation.alpha(1).restart();
-
- // on this click display html text box
-
- }
-
- function dragstart() {
- d3.select(this).classed("fixed", true);
- }
-
- function dragged(event, d) {
-
- console.log("dragged",d.id);
- // set x position of dragged node
- d.fx = clamp(event.x, 0, width);
- // set x position of dragged node
- d.fy = clamp(event.y, 0, height);
- // sets duration of animation before restart
- simulation.alpha(1).restart();
- }
-
- function clamp(x, lo, hi) {
- return x < lo ? lo : x > hi ? hi : x;
- }
-
-
- // desktop network
-
-
|