#java #graph #jung
#java #График #jung
Вопрос:
Я создал график со 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());
Спасибо
Ответ №1:
Размещение стрелок выполняется путем разделения ребра до тех пор, пока дальний сегмент не будет заключен в форму вершины, а затем перемещается на единицу назад. Если дальняя конечная точка не находится внутри формы вершины, когда начинается операция, должно быть выдано исключение. Вы выбрали правильное решение, которое заключается в центрировании ваших вершинных фигур в начале координат, прежде чем они будут переведены на место. Том Нельсон
Комментарии:
1. Привет Тому Нельсону, одному из разработчиков библиотеки JUNG 🙂
Ответ №2:
Проблема вызвана EdgeRenderer. Это запутывается, если ребра соединены с верхним левым углом вершины. Когда я изменил свои фигуры с
CIRCLE(new Ellipse2D.Double(0,0,40,40)),
BOX(new Rectangle2D.Double(0,0,40,40));
Для
CIRCLE(new Ellipse2D.Double(-20,-20,40,40)),
BOX(new Rectangle2D.Double(-20,-20,40,40));
Точки соединения перемещены в центр вершин, и оттуда EdgeRenderer делает свое волшебство без проблем.
Однако я не понимаю, почему изменение положения рамки фигуры имеет такое значение. Был бы рад, если бы кто-нибудь мог это объяснить.