Java-график Юнга: некоторые ребра пропускают стрелки

#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 делает свое волшебство без проблем.
Однако я не понимаю, почему изменение положения рамки фигуры имеет такое значение. Был бы рад, если бы кто-нибудь мог это объяснить.