2016-08-19 5 views
4

이 질문은 이전의 "그래프 초기화 후 D3-Force 업데이트 매개 변수"(D3-Force updating parameters after initializing graph)의 후속 작업으로 @altocumulus가 응답 한 것입니다.d3-force 그래프의 초기화 후 ForceCollide의 반경

일부 노드의 반경을 수정 한 후 시뮬레이션 작업을 업데이트하려고합니다. 그러나 변경 사항을 반영하기 위해 forceCollide을 호출하면 작동하지 않습니다.

그래프는 우선 반경에 해당하는 힘을 갖는 forceCollide 및 함수를 이용하여 올바르게 시작 :

var forceCollide = d3.forceCollide() 
.radius(function(d){return d.radius;}) 
.iterations(2) 
.strength(0.95); 

var simulation = d3.forceSimulation() 
.velocityDecay(velocityDecay) 
.force("collide", forceCollide); 

난 후 d.radius 개체를 수정 및 변경 사항을 반영하기 위해 forceCollide 원한다. 나는 forceCollide에 호출 할 때, 다시는 작동하지 않습니다 왜 이런 일이에

forceCollide.radius(function(d){ 
d.radius;}) 

어떤 생각?

답변

5

반경을 실제로 업데이트하지 않습니다. 반경을 결정하는 데 사용 된 콜백을 다시 설정하는 중입니다. 반경은 이전과 비교하여 변경되지 않습니다. 으로 변경 되더라도 업데이트 된 데이터를 기반으로 반경이 재평가되지 않으므로 업데이트가 실행되지 않습니다.

링크 강제 실행의 콜백을 업데이트 할 때 강제 실행 자체가 초기화됩니다.

force.distance = function(_) { 
    return arguments.length ? (distance = typeof _ === "function" ? _ : constant(+_), initializeDistance(), force) : distance; 
}; 

같은 다른 힘 '매개 변수의 다른 많은 업데이트 마찬가지 다음 source에보기는 initializeDistance()에 대한 호출을 보여줍니다.

collide 힘의 원천을 찾고, 그러나, 하나는 호출에는 초기화가 없음을 통지 :

force.radius = function(_) { 
    return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), force) : radius; 
}; 

콜백이 다시 forceCollide.radius()를 호출 할 필요가 없습니다 변경되지 않기 때문에. 대신 전화해야합니다

forceCollide.initialize(simulation.nodes()); 

이렇게하면 업데이트 된 데이터를 기반으로 반지름이 재평가됩니다.

+0

@altocumulus 빠른 답변 감사합니다. 그리고 어떻게 시간을내어 당신이 그것에 도달했는지 설명해 주셔서 감사합니다! 이제 소스 라이브러리의 유틸리티를 이해합니다. –