对于力布局,您可以将节点的 'fixed' 属性设置为 true,以防止其受到模拟的影响。之后,您应该可以手动设置它的位置。您可以选择在函数调用中执行此操作:
function pinNode(node) {
node.fixed = true;
}
function unpinNode(node) {
node.fixed = false;
}
我相信你可以通过这样的调用获得一个左上角的节点:pinNode(node, 0, 0)
. 只要节点的固定属性设置为 true,它就应该不受 sim 影响。您可能会发现文档中的这个片段很有帮助;它描述了固定属性如何受 force.drag 影响:
将行为绑定到节点以允许使用鼠标或触摸进行交互式拖动。将此与节点上的调用运算符结合使用;例如,在初始化时说 node.call(force.drag)。拖动事件在鼠标悬停时设置节点的固定属性,这样一旦鼠标悬停在节点上,它就会停止移动。固定鼠标悬停,而不是鼠标按下,可以更容易地捕捉移动节点。当接收到 mousedown 事件时,在每个后续 mousemove 直到 mouseup 时,节点中心都设置为当前鼠标位置。此外,每次鼠标移动都会触发力布局的恢复,从而重新加热模拟。如果您希望被拖动的节点在拖动后保持固定,请在 dragstart 上将 fixed 属性设置为 true,如粘力布局示例中所示。
强制拖动
另见此处:强制布局节点
如果要使用链接距离函数,请在创建力布局时包含它:
var force = d3.layout.force()
.size(width, height)
.linkStrength(0.5) // how much can link distance be overridedn by the simulation
.linkDistance(function() {return /* some evaluation */;});
// ...
// You might need to defer the calculation of linkDistance until later,
// such as in update(), since nodes might not have the properties
// that you need to check until that point:
function update() {
force
.nodes(nodes)
.links(links)
.linkDistance(function(link) {
// The function gets called for each link in the simulation.
// Each link will be connected to two nodes, source and target,
// which may be useful in determining link distance.
if (link.source.someProperty || link.target.somePropery) {
return /* something */;
} else {
return /* something else */;
}
});
}