2013-11-20 66 views
1

我正在使用帶有小負值的力佈局來避免將SVG元素放在彼此之上。但是,我需要將這些項目保留在其原始位置的〜20px範圍內。有沒有辦法限制物品移動的總淨X/Y距離?D3 Force佈局的最大距離限制?

每個SVG元素代表一個公共汽車站,所以重要的是物品不要重疊,但也不要離開原來的位置太遠。

回答

3

有一個在力佈局本身對這個沒辦法,但你可以做到這一點很容易自己在處理該tick事件功能:

force.on("tick", function() { 
    nodes.attr("transform", function(d) { 
    return "translate(" + Math.min(0, d.x) + "," + Math.min(0, d.y) + ")"; 
    }); 
}); 

這將綁定的位置是右上方(0,0)。你顯然可以修改它以任何其他方式進行綁定(可能使用嵌套的Math.min/Math.max)。你甚至可以通過存儲允許的位置範圍與元素並引用它來動態地做到這一點。

查看here查看here的示例,該示例使用此技術來限制使用強制佈局浮動的標籤位置。

+0

有趣的 - 我應該在我的問題更具體。在我的實現中,不是移動SVG中包含的形狀,而是使用CSS頂部和左側偏移來移動(小)SVG容器本身。雖然我可能會將最重要的變化設置爲Math.min(item.top,item.top + 5),但是不會將相同的項目都轉移到相同的界限? – arami

+0

不確定你的意思 - 你肯定可以用這種方法做的是記錄原始位置,並限制任何力量指向運動在20x20框內。 –