D3
OG
Old school D3 from simpler times
All examples
By author
By category
About
arcsin1
Full window
Github gist
Bounding Circle
Built with
blockbuilder.org
<!DOCTYPE html> <head> <title>Bounding circle Collision</title> <meta charset="utf-8" /> <script src="https://d3js.org/d3.v4.min.js"></script> </head> <style> svg { height: 600px; width: 1200px; border: 1px solid lightgray; } </style> <body> <div id="viz"> <svg class="main"> </svg> </div> </body> <script> var start = 0 var randomPoints = d3.range(500).map(function (d,i) { return {value: Math.random(), key: i} }) //构建randomPoints 数组 为开始的动画做准备 定一个结构 // var randomPoints = [] var currentTick = 500 var networkCenter = d3.forceCenter().x(600).y(300); //设定(600,300)为世界中心 var forceX = d3.forceX(function (d) {return d.value * 1200}) .strength(0.5) var forceY = d3.forceY(function (d) {return 200}) .strength(0.03) var collide = d3.forceCollide(function (d,i) { return d.value * 20 }) ///设置碰撞力的半径 .strength(0.5) .iterations(1) //则将每个应用程序的迭代次数设置为指定的数字,并返回这个力 这个没必要写,默认就是1 // var color = d3.scaleOrdinal(["#8a2b57", "#b13e1f", "#aa8d0f", "#b67221"]) var color = d3.scaleOrdinal(d3.schemeCategory10); //创建一个颜色比例尺 其实还有不错的比例尺 //创建一个颜色比例尺 var color = d3.scaleOrdinal(d3.schemeCategory10); d3.select("svg.main") .append("g") .attr("class", "viz") // 时间动画 参考https://developer.mozilla.org/zh-CN/docs/Web/API/Window/requestAnimationFrame function step(timestamp) { if (!start) start = timestamp; var progress = timestamp - start; particles(progress); window.requestAnimationFrame(step); } window.requestAnimationFrame(step); // 把上面时间动画注释了 直接执行particles(),你每次刷新页面就会随机给你生成不同位置且有序很多矩形 // particles() function particles(progress) { //progress不必要传 var nodeEnter = d3.select("g.viz") .selectAll("g.node") .data(randomPoints, function (d) {return d.key}) .enter() .append("g") .attr("class", "node") //这段代码是处理:有多余数据,但是没有足够的元素 就添加元素 var nodeExit = d3.select("g.viz") .selectAll("g.node") .data(randomPoints, function (d) {return d.key}) .exit() .remove() //相反如果存在多余元素,且没有数据跟它绑定,就删除掉 nodeEnter.append("circle") .attr("class", "base") .style("stroke-width", "1px") .style("stroke", function (d, i) {return d3.color(color(d.key)).darker(1)}) .style("fill", function (d, i) {return d3.color(color(d.key)).brighter(1)}) var force = d3.forceSimulation(randomPoints) .velocityDecay(0.6) // 摩擦力 .force("center", networkCenter) //设定重力中心,那么(250,250)的中心,所有节点都会“落入世界的中心” .force("x", forceX) .force("y", forceY) .force("collide", collide) // .on("tick", updateNetwork) //此方法可以设置力导向图的更新方法 此图 没做任何用处 .stop() force.tick() //动画的计算进入下一步 d3.selectAll("circle") .attr("r", function (d) {return d.value * 20}) .attr("cx", function (d) {return d.x + -d.value * 10}) .attr("cy", function (d) {return d.y + -d.value * 20}) // 创建圆形 randomPoints.forEach(function (d) { d.value = d.value - 0.003 }) //对数组randomPoints 做一个减法 randomPoints = randomPoints.filter(function (d) {return d.value > 0}) // 删除value大1 randomPoints.push({value: 1.25, x: 1300, y: Math.random() * 500 + 100, key: currentTick += 1}) } </script>
https://d3js.org/d3.v4.min.js