Создать двунаправленные стрелки в JUNG - PullRequest
0 голосов
/ 25 апреля 2018

Можно ли создать двунаправленные стрелки в JUNG с помощью FRLayout?В идеале, возможно ли иметь алгоритм, который использует эти стрелки (конечные точки являются стрелками на обоих концах) для случаев, когда a-> b и b <-a? </p>

Я думаю, что это может быть связано с

 Renderer.Edge<String, String> edgeRenderer = 
        vv.getRenderer().getEdgeRenderer();

но не могу понять, как получить формы стрелок

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Вы можете сделать что-то вроде этого хака, чтобы (в данном случае) изогнутые края накладывались друг на друга:

        vv.getRenderContext().setEdgeShapeTransformer(new Function<String, Shape> () {
            @Override
            public Shape apply(String edge) {
                Pair<String> endpoints = graph.getEndpoints(edge);
                float controlY = 60.f;
                 // use some hacked 'ordering' of the endpoint nodes so that the curve for A->B is on the same side as the curve from B->A
                if (endpoints.getFirst().toString().compareTo(endpoints.getSecond().toString()) < 0) {
                    controlY *= -1;
                }
                return new QuadCurve2D.Float(0.0f, 0.0f, 0.5f, controlY, 1.0f, 0.0f);
            }
        });
0 голосов
/ 29 апреля 2018

Если вы визуализируете края как прямые линии, тогда антипараллельные края (a-> b и b-> a) будут выглядеть так, как вы хотите.

Если вы посмотрите на PluggableRendererDemo вы увидите примеры того, как изменить форму ребра:

vv.getRenderContext().setEdgeShapeTransformer(EdgeShape.line(graph));

Если вы действительно хотите визуализировать два отдельных ребра как одно ребро, это будет более сложным;по сути, вам нужно взломать (или создать подкласс) BasicEdgeRenderer , чтобы он проверял антипараллельные ребра и обрабатывал их по-разному.Чтобы нарисовать стрелки на обоих концах ребра, взгляните на код в этом классе для рендеринга неориентированных ребер (которые могут иметь стрелки на обоих концах).

...