我的問題是如何創建一個網絡可視化方案,使邊緣和/或箭頭終止在節點的邊界。鏈接和箭頭終止在D3節點的邊界
我正在使用D3.js根據Curved Links基本模型繪製有向圖,並添加了「標記」箭頭,如other question中所述。我的可視化中的節點根據其屬性改變其大小和不透明度。這引入了兩個問題:(1)當節點改變尺寸時,箭頭沒有指向節點的邊緣;(2)當邊緣部分透明時,邊緣的尾部通過節點出現。
對於第一個問題,有幾個解決方案可用:this one聲稱可以正確地獲得箭頭偏移量,但它不會影響鏈接結束端點。也有解決方案here的建議,但我沒有看到任何實際的完整工作代碼。 This JS fiddle具有我想要的箭頭形狀,但代碼是相當不透明的,而不是模塊化的,我可以找出如何應用於我自己的情況。
正如我所說,我的鏈接是基於彎曲鏈接例子定義:
graph.links.forEach(function(link) {
var s = nodes[link.source],
t = nodes[link.target],
i = {}, // intermediate node
property1 = link.property1;
nodes.push(i);
links.push({source: s, target: i}, {source: i, target: t});
bilinks.push([s, i, t, property1]);
});
然後,如果我的D3是如何工作的鬆散的理解是基本正確的,鏈接被吸引通過下面的代碼每個刻度:
force.on("tick", function() {
link.attr("d", function(d) {
if (d[0] == d[2]) {
return "M" + d[0].x + "," + d[0].y
+ "A" + "20,20 -50 1,1 " + (1.001 * d[2].x) + "," + (1.001 * d[2].y)
;
} else {
return "M" + d[0].x + "," + d[0].y
+ "S" + d[1].x + "," + d[1].y
+ " " + d[2].x + "," + d[2].y;
}
});
node.attr("transform", function(d) {
return "translate(" + d.x + "," + d.y + ")";
});
});
所以我的問題是,如何在達到通常期望的方式更改此代碼(我認爲正常)可視化方案使得邊緣和/或箭頭終止在節點的邊界甚至他們改變大小。
我創建了一個JS Fiddle,其中包含查看和解決問題所需的所有位。它還包括調整箭頭以匹配它們所在的鏈接,並且該功能需要與此問題的解決方案兼容。
我想,基本上,你需要計算節點和鏈接的外周之間的交點...動態。這對於直線是可以的,但對於花鍵路徑,您需要計算控制點以獲得正確的接近角度。聽起來不像我有趣。 –
形狀總是圓形的嗎? – Ian
對於我而言,節點並不總是圓形的,但是如果我可以爲圓形做它,那麼我可以使用三角形和正方形或任何其他形狀的邊界圓。所以它不需要完全在邊界上:稍微遠離邊界稍好一點。本質上,我只是想通過每一端節點的「大小」參數(而不是圓的「r」)來抵消鏈接的末端......並將箭頭末端與鏈接的提示幾乎齊平。 –