this codepen demo을 살펴보십시오. 나는 svg 객체를 클릭하여 인스턴스가 생성 된 시뮬레이션 틱을보고 전환이 발생하는지 확인합니다. 간단한 함수를 사용합니다 :d3js v4 : onclick 노드에 강제로 적용하여 트위닝처럼 보이게하려면 어떻게해야합니까?
function transitionTo() {
simulation
.on("tick", ticked);
}
그러나 "트윈"이 존재하지 않음을 데모에서 확인할 수 있습니다. 내가 제안하는 트위닝의 예를 보려면 here을 참조하십시오!
어디로 잘못 갔습니까? ticked()
함수는 노드가 어디에 있는지 알고 있습니까? 노드 대신 시뮬레이션 위치를 지정해야합니까? (데모 위의 링크에 포함)
키 코드 :
var data = {
nodes:d3.range(0, range).map(function(d){ return {label: "l"+d ,r: config.radius,color: d3.scaleOrdinal(d3.schemeCategory10)}})
}
svg
.attr("width", config.canvas.width)
.attr("height", config.canvas.height)
.attr("id", "canvas")
.style("border", "1px solid black")
.attr("onclick", "transitionTo()");
}
var simulation = d3.forceSimulation()
.force("collide",d3.forceCollide(function(d){return d.r + 1 }).iterations(15))
.force("charge", d3.forceManyBody().strength(1))
.force("center", d3.forceCenter(config.canvas.width/2, config.canvas.height/2))
.force("y", d3.forceY(0))
.force("x", d3.forceX(0));
var node = svg.append("g")
.attr("class", "nodes")
.selectAll("circle")
.data(data.nodes)
.enter().append("circle")
.attr("r", function(d){ return d.r })
.attr('cx', function(d, i) { return i % 10 * (config.canvas.width - config.margin.x*2)/10 + config.radius + config.margin.x; })
.attr('cy', function(d, i) {return (Math.floor(i/10) * (config.canvas.height - config.margin.y*2)/10) + config.margin.y + config.radius});
var ticked = function() {
node
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
}
simulation
.nodes(data.nodes);
function transitionTo() {
simulation
.on("tick", ticked);
}
내가 D3 v4를위한 해답을 선호하지만, 어떤 아이디어가 매우 환영받을 것입니다! 이 d3 놈 덕분에.