このライブラリを使用してから長い時間が経ちましたが、同様の問題がありました。あなたができることの1つはこれです。エッジの長さを操作して、隣接するエッジの長さが異なるようにします。つまり、エッジが隣接するエッジよりも長くなります。このようにして、ラベルの重複を避けることができます。次のコードに示すように、エッジとノードのレンダリングをオーバーライドできる場合があります。
カスタム エッジ タイプの関数は上記のことを行っていませんが、レンダリングをオーバーライドする方法を理解するのに役立ちます。エッジを繰り返し処理し、レンダリングする長さを示すフラグを設定できます。たとえばcustomLength:'short'/'long'
、レンダラー関数でこのフラグにアクセスし、getFDEdgeType
それに応じて長さを変更できます。それが役に立てば幸い。
,initFD: function() {
// other stuff..... like lableType etc.
// define your own edge type
$jit.ForceDirected.Plot.EdgeTypes.implement({
'label-arrow-line': this.getFDEdgeType()
});
}
,getFDEdgeType: function() {
return {
'render':function(adj, canvas) {
// get nodes cartesian coordinates
var pos = adj.nodeFrom.pos.getc(true);
var posChild = adj.nodeTo.pos.getc(true);
// plot arrow edge
this.edgeHelper.line.render( { x: pos.x, y: pos.y }, { x: posChild.x, y: posChild.y }, canvas );
// check for edge label in data
if( adj.getData('labelid') && adj.getData('labeltext') ) {
// now adjust the label placement
var radius = this.viz.canvas.getSize();
var x = parseInt((pos.x + posChild.x - ( adj.getData('labeltext').length * 1)) / 2);
var y = parseInt((pos.y + posChild.y ) /2);
if( adj.getData('showLabel') == 'true' )
this.viz.canvas.getCtx().fillText(adj.getData('labeltext'), x, y);
else this.viz.canvas.getCtx().fillText('', x, y); // do not show label is showLabel is false
}
},
'contains': function(adj,pos){
var posFrom = adj.nodeFrom.pos.getc(true);
var posTo = adj.nodeTo.pos.getc(true);
return this.edgeHelper.line.contains({ x: posFrom.x, y: posFrom.y }, { x: posTo.x, y: posTo.y }, { x: pos.x, y: pos.y }, adj.Config.dim);
}
};
}