はじめに
私は、グラフの頂点をさまざまなサイズでレンダリングするプロジェクトに取り組んでいます(相対的な作業負荷に応じて)。
問題
私はそれがどのように機能することを期待していましたか
頂点の動的サイズ変更をオフにすると、次のようになります。
したがって、ここではすべてが正しいです。接続円は、円形の境界線上に配置されます。
この結果は、リスト 1のコードによって達成されます。
動的サイズ変更で実際に起こること
ここで、接続円が境界近くのどこかに配置されていることがわかりますが、常に正しい位置がありません。
この結果は、リスト 2のコードによって達成されます。
リスト 1 - サイズ変更なし
viewer.getRenderContext().setVertexShapeTransformer(vertex -> {
return vertex.getShape();
});
リスト 2 - サイズ変更あり
viewer.getRenderContext().setVertexShapeTransformer(vertex -> {
double localWorkload = vertex.getLocalWorkload();
double globalWorkload = graph.getGlobalWorkload();
double relation = local / global;
return AffineTransform.getScaledInstance(relation, relation).createTransformedShape(vertex.getShape());
});
実際には、頂点内の頂点の形状の 10 の異なるサイズを遅延して事前計算しています。しかし、このコード スニペットはより明確で、同じ結果を達成します (パフォーマンスは劣りますが)。
私がすでに試して見たこと
これはすべてedu.uci.ics.jung.visualization.renderers
パッケージで行われます。
BasicEdgeArrowRenderingSupport
この問題を修正するために利用できるものがないかクラスをチェックしました- の `flatness` であるかどうかを確認し
PathIterator
ましたBasicEdgeArrowRenderingSupport
arrowPlacementTollerance
それがパラメータであるかどうかを確認しました
質問
リスト 1で生成された目的の結果を達成するにはどうすればよいでしょうか?リスト 2のように形状を動的にサイズ変更します。
この質問に対する答えは、次のいずれかになると思います。
- 私がした(論理的またはプログラム的に)いくつかの本質的な失敗があります
- または、エッジ矢印レンダリング サポートの基本的な問題です。