Изменение формы и положения ребер по Юнгу

Мне нужно расположить узлы определенным образом. Я пробовал со статической компоновкой. Я могу изменить положение узлов, но не могу разместить ребра в определенных местах. В статической компоновке есть метод setLocation, который я использовал для изменения положения узла, но для ребер я понятия не имею, как разместить их в определенных местах, чтобы вновь расположенные узлы были связаны с ребрами.

Другой вопрос: как я могу изменить форму ребра в Юнге, переопределив метод преобразования.


person Muhammad Asaduzzaman    schedule 27.02.2011    source источник


Ответы (2)


В настоящее время JUNG не обеспечивает хорошей поддержки для размещения на краю. EdgeShape и, в частности, EdgeShape.Orthogonal, покажет вам, какая встроенная поддержка существует.

person Joshua O'Madadhain    schedule 18.03.2011

Я знаю, что эта ветка немного устарела, но я думаю, что ее нужно возродить - надеюсь, что на этот вопрос еще не ответили. Причина в том, что ответ мистера О'Мададхайнса не смог мне помочь. (возможно, из-за моего дефицита и желания понимать документацию) После некоторой работы над техниками JUNG я был бы рад получить квалифицированный комментарий сейчас.

Есть два (кажущихся) простых способа преобразования краев в статическом макете.

Первый способ — переопределить метод «transform» Transformer, непосредственно влияющий на форму края:

Transformer<Graph<Context<String, String>, String>, Shape> edgeTransformer = new Transformer<Graph<Context<String,String>,String>,Shape>(){
        @Override
        public Shape transform(Graph<Context<String, String>, String> graphStringContext)
        {
            return (new Line2D.Double());
        }
    };

(если используется график "График")

Что касается смысловых ребер, которые должны соединяться, то простым примером будет возврат отдельного Line2D (который будет состоять из центральных точек, которые имеют затронутые вершины) в средство визуализации. Вызов метода, очевидно, таков:

vv.getRenderContext().setEdgeShapeTransformer(edgeTransform);

НО: это просто не работает. (может быть, потому что я сделал это неправильно; отсутствие руководств оправдывает это) Что бы кто-то ни пытался вернуть метод «преобразования», средство визуализации просто получит нулевые значения.

Вторая возможность — разделить вершинное преобразование на два преобразователя. Первый преобразователь установит только базовую позицию вершины, используя:

Transformer<String, Point2D> vertexPositionTransformer = new Transformer<String,Point2D>() {
            @Override
            public Point2D transform(String st) {
                return new Point2D.Double();
            };

2-й не является обязательным. Его можно использовать для изменения размера вершины или для того, чтобы фигура выглядела как угодно. Потребуются позиции преобразованных вершин местоположения, потому что этот преобразователь переопределит набор позиций.

Transformer<String, Shape> vertexShapeTransformer = new Transformer<String, Shape>() {
            @Override
            public Shape transform(String st) {
                return new Ellipse2D.Double();
            };

Теперь можно создать экземпляр макета. Он не будет построен по умолчанию с графом в качестве одного параметра, а с дополнительным параметром: vertexPositionTransformer. Это будет выглядеть так:

StaticLayout<String, String> layout = new StaticLayout<String, String>(graph, vertexPositionTransformer);

Преобразование ребер при построении макета автоматически установит конечные точки ребер в центр каждой включенной вершины.

В примерах кода я отказался от содержания методов «преобразования», которые, конечно, будут отличаться от цели к цели. Использование классов/объектов «Трансформатор» должно выполняться после добавления в граф вершин и ребер, на которые они будут воздействовать. Вот и все. Пожалуйста, исправьте плохой стиль и подобные проблемы. Мне приятно получать обратную связь.

Привет

Лукас Кошин

person Lukas Koschine    schedule 26.09.2012
comment
На самом деле это не ответ на исходный вопрос, поэтому добавление его в качестве ответа не совсем уместно. К вашему сведению: я предлагаю вам начать, если вы еще этого не сделали, с примера кода. - person Joshua O'Madadhain; 27.09.2012
comment
Образца, относящегося к размещению статического края, не существует! Вопрос заключался в том, как расположить ребра относительно статических узлов. Я ответил на этот вопрос или ошибаюсь? - person Lukas Koschine; 27.09.2012