Я пытаюсь сделать простую анимированную визуализацию, вокруг которой вращаются три кольца точек. Среднее кольцо точек должно вращаться на радиусе, который перемещается между внутренним и внешним кольцом.
var nodes = [].concat(
d3.range(80).map(function() { return {type: "a", phi0: 90, speed: 5, force:100}; }),
d3.range(160).map(function() { return {type: "b", phi0:190, speed: 10, force: 200}; }),
d3.range(240).map(function() { return {type: "c", phi0:290, speed: 15, force: 300}; })
);
var t0 = Date.now();
var svg = d3.select("svg");
var node = d3.select("svg")
.append("g")
.selectAll("circle")
.data(nodes)
.enter().append("circle")
.attr("r", 2.5)
.attr("fill", function(d,i) {
if (i == 1) {
return "pink"
} else {
return d.type === "a" ? "brown" : d.type == "b" ? "steelblue" : "gainsboro";
}
})
var sim = d3.forceSimulation(nodes)
var forcecollide = sim.force("charge", d3.forceCollide().radius(5))
sim.on("tick", ticked);
function ticked() {
node
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
}
hitmax = false;
hitmin = false;
function console(text){
svg.selectAll("text").remove();
svg.append("text").text(text);
}
d3.timer(function() {
var delta = (Date.now() - t0);
nodes.forEach(function(d){
if (d.type == "b" && d.force > 300) {
hitmax = true;
hitmin = false;
} else if (d.type == "b" && d.force < 100) {
hitmin = true;
hitmax = false;
}
if (d.type == "b" && hitmax == true) {
d.force = d.force - 1;
} else if (d.type == "b" && hitmin == true) {
d.force = d.force + 1;
} else if(d.type == "b"){
d.force = d.force + 1;
}
if (d.type =="b") {
console(d.force + " hitmax:" + hitmax + " hitmin:" + hitmin)
}
sim.force("r", d3.forceRadial(function(d) {
return d.force;
}))
})
svg.selectAll("circle").filter(function(d,i) { return d.type === "a";}).attr("transform", function(d) {
return "rotate(" + d.phi0 + delta * d.speed/200 + ")";
});
svg.selectAll("circle").filter(function(d,i) { return d.type === "b";}).attr("transform", function(d) {
return "rotate("+ d.phi0 + delta * d.speed/200 + ")";
});
svg.selectAll("circle").filter(function(d,i) { return d.type === "c";}).attr("transform", function(d) {
return "rotate(" + d.phi0 + delta * d.speed/200 + ")";
});
});
JS Fiddle здесь: http://jsfiddle.net/_shimizu/Q5Jag/1/
Вместо того, чтобы орбита среднего кольца двигалась между внутренним и внешним кольцом, она медленно растет, немного сжимается, затем перестает изменяться. Я сделал свою визуализацию распечатывать переменные для отладки.
Любые советы о том, как заставить это работать, или лучшие рекомендации d3.
Я понимаю, что могу делать это совершенно неправильно.
Спасибо.