Java JUNG Graph: на некоторых ребрах отсутствуют стрелки

Я сделал график с помощью StaticLayout и изменил формы\цвета вершин. Я не трансформировал ничего, связанного с краями. Все ребра направлены, но некоторые из них пропускают стрелки! Как это могло случиться?

скриншот

Код визуализации графика:

    Layout<Object, String> layout = new StaticLayout<Object, String>(graphProvider.graphFor(market),new MarketVertexLayoutTransformer(market,panel.getMarketGraphPane().getSize() )) ;
    layout.setSize(panel.getMarketGraphPane().getSize());
    VisualizationViewer<Object,String> graphPanel = new VisualizationViewer<Object,String>(layout);
    graphPanel.getRenderContext().setVertexShapeTransformer(new MarketVertexShapeTransformer());
    graphPanel.getRenderContext().setVertexFillPaintTransformer(new MarketVertexColorTransformer());
    panel.getMarketGraphPane().add(graphPanel, BorderLayout.CENTER);
    panel.getMarketGraphPane().revalidate();

Графики

graph = new DirectedSparseGraph<Object, String>();

и края создаются так

   graph.addEdge(bundle.getGood()+"->"+transformation,bundle.getGood(),transformation);
   graph.addEdge(transformation+"->"+bundle.getGood(),transformation,bundle.getGood());

Спасибо


person Boris Mikhaylov    schedule 19.10.2011    source источник


Ответы (2)


Размещение стрелки выполняется путем разделения ребра до тех пор, пока дальний сегмент не будет заключен в фигуру вершины, а затем перемещается назад. Если дальняя конечная точка не находится внутри формы вершины при запуске операции, должно возникнуть исключение. Вы выбрали правильное решение, заключающееся в том, чтобы центрировать формы вершин в начале координат, прежде чем они будут переведены на место. Том Нельсон

person Tom    schedule 20.10.2011
comment
Привет Тому Нельсону, одному из сопровождающих библиотеки JUNG :) - person ee.; 21.10.2011

Проблема вызвана EdgeRenderer. Это сбивает с толку, если ребра соединены с верхним левым углом вершины. Когда я изменил свои формы с

CIRCLE(new Ellipse2D.Double(0,0,40,40)),
BOX(new Rectangle2D.Double(0,0,40,40));

to

CIRCLE(new Ellipse2D.Double(-20,-20,40,40)),
BOX(new Rectangle2D.Double(-20,-20,40,40));

Точки соединения перемещены в центр вершин, и оттуда EdgeRenderer без проблем творит чудеса. Однако я не понимаю, почему изменение положения кадра формы имеет такое значение. Был бы рад, если бы кто-нибудь это объяснил.

person Boris Mikhaylov    schedule 20.10.2011