нужно предварительно объединить ребра графа, такие как стрелки

Я сделал свою домашнюю работу и искал в Google образец и тему, на которую уже был дан ответ в stackoverflow. Но ничего не найдено.

Моя проблема обычные края, у которых нет вида, как у стрелок.

Вот что я делаю, чтобы надеяться, что есть стрелки вперед от цели к месту назначения:

LabelRenderer nameLabel = new LabelRenderer("name");
        nameLabel.setRoundedCorner(8, 8);
        DefaultRendererFactory rendererFactory = new DefaultRendererFactory(nameLabel);
        EdgeRenderer edgeRenderer;
    edgeRenderer = new EdgeRenderer(prefuse.Constants.EDGE_TYPE_LINE, prefuse.Constants.EDGE_ARROW_FORWARD);
        rendererFactory.setDefaultEdgeRenderer(edgeRenderer);
        vis.setRendererFactory(rendererFactory);


Вот что я вижу о цвете краев, надеясь, что они не должны быть прозрачными:

int[] palette = new int[]{ColorLib.rgb(255, 180, 180), ColorLib.rgb(190, 190, 255)};

        DataColorAction fill = new DataColorAction("socialnet.nodes", "gender", Constants.NOMINAL, VisualItem.FILLCOLOR, palette);

        ColorAction text = new ColorAction("socialnet.nodes", VisualItem.TEXTCOLOR, ColorLib.gray(0));


        ColorAction edges = new ColorAction("socialnet.edges", VisualItem.STROKECOLOR, ColorLib.gray(200));
        ColorAction arrow = new ColorAction("socialnet.edges", VisualItem.FILLCOLOR, ColorLib.gray(200));

        ActionList colour = new ActionList();
        colour.add(fill);
        colour.add(text);
        colour.add(edges);
        colour.add(arrow);
        vis.putAction("colour", colour);

Таким образом, я думаю, где я ошибаюсь? Почему мои края не кажутся стрелками?

Спасибо за любую идею.

Для более подробной информации я хочу вставить весь код:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package prefusedeneme;

import javax.swing.JFrame;

import prefuse.data.*;
import prefuse.data.io.*;
import prefuse.Display;
import prefuse.Visualization;
import prefuse.render.*;
import prefuse.util.*;
import prefuse.action.assignment.*;
import prefuse.Constants;
import prefuse.visual.*;
import prefuse.action.*;
import prefuse.activity.*;
import prefuse.action.layout.graph.*;
import prefuse.controls.*;
import prefuse.data.expression.Predicate;
import prefuse.data.expression.parser.ExpressionParser;

public class SocialNetworkVis {

    public static void main(String argv[]) {

        // 1. Load the data

        Graph graph = null;
        /* graph will contain the core data */
        try {
            graph = new GraphMLReader().readGraph("socialnet.xml");

        /* load the data from an XML file */
        } catch (DataIOException e) {
            e.printStackTrace();
            System.err.println("Error loading graph. Exiting...");
            System.exit(1);
        }

        // 2. prepare the visualization

        Visualization vis = new Visualization();
        /* vis is the main object that will run the visualization */
        vis.add("socialnet", graph);
        /* add our data to the visualization */

        // 3. setup the renderers and the render factory

        // labels for name
        LabelRenderer nameLabel = new LabelRenderer("name");
        nameLabel.setRoundedCorner(8, 8);
        /* nameLabel decribes how to draw the data elements labeled as "name" */

        // create the render factory
        DefaultRendererFactory rendererFactory = new DefaultRendererFactory(nameLabel);
        EdgeRenderer edgeRenderer;
    edgeRenderer = new EdgeRenderer(prefuse.Constants.EDGE_TYPE_LINE, prefuse.Constants.EDGE_ARROW_FORWARD);
        rendererFactory.setDefaultEdgeRenderer(edgeRenderer);
        vis.setRendererFactory(rendererFactory);


        // 4. process the actions

        // colour palette for nominal data type
        int[] palette = new int[]{ColorLib.rgb(255, 180, 180), ColorLib.rgb(190, 190, 255)};
        /* ColorLib.rgb converts the colour values to integers */


        // map data to colours in the palette
        DataColorAction fill = new DataColorAction("socialnet.nodes", "gender", Constants.NOMINAL, VisualItem.FILLCOLOR, palette);
        /* fill describes what colour to draw the graph based on a portion of the data */

        // node text
        ColorAction text = new ColorAction("socialnet.nodes", VisualItem.TEXTCOLOR, ColorLib.gray(0));
        /* text describes what colour to draw the text */

        // edge
        ColorAction edges = new ColorAction("socialnet.edges", VisualItem.STROKECOLOR, ColorLib.gray(200));
        ColorAction arrow = new ColorAction("socialnet.edges", VisualItem.FILLCOLOR, ColorLib.gray(200));
        /* edge describes what colour to draw the edges */

        // combine the colour assignments into an action list
        ActionList colour = new ActionList();
        colour.add(fill);
        colour.add(text);
        colour.add(edges);
        colour.add(arrow);
        vis.putAction("colour", colour);
        /* add the colour actions to the visualization */

        // create a separate action list for the layout
        ActionList layout = new ActionList(Activity.INFINITY);
        layout.add(new ForceDirectedLayout("socialnet"));
        /* use a force-directed graph layout with default parameters */

        layout.add(new RepaintAction());
        /* repaint after each movement of the graph nodes */

        vis.putAction("layout", layout);
        /* add the laout actions to the visualization */

        // 5. add interactive controls for visualization

        Display display = new Display(vis);
        display.setSize(700, 700);
        display.pan(350, 350);  // pan to the middle
        display.addControlListener(new DragControl());
        /* allow items to be dragged around */

        display.addControlListener(new PanControl());
        /* allow the display to be panned (moved left/right, up/down) (left-drag)*/

        display.addControlListener(new ZoomControl());
        /* allow the display to be zoomed (right-drag) */

        // 6. launch the visualizer in a JFrame

        JFrame frame = new JFrame("prefuse tutorial: socialnet");
        /* frame is the main window */

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(display);
        /* add the display (which holds the visualization) to the window */

        frame.pack();
        frame.setVisible(true);

        /* start the visualization working */
        vis.run("colour");
        vis.run("layout");

    }
}



person merve    schedule 04.01.2011    source источник
comment
привет, ответ на мой вопрос здесь: sourceforge .net/projects/prefuse/forums/forum/343013/topic/ также я нашел работающий пример на следующей странице, но он немного сложен для базового поисковика графа: goosebumps4all.net/34all/bb/showthread.php?tid=17 если я должен дать какую-то строку кода ключевые строки здесь: ‹pre›... graph = new GraphMLReader().readGraph(socialnet.xml); ... Таблица n = graph.getNodeTable(); Таблица e = graph.getEdgeTable(); График g_new = новый График (n, e, правда); ‹/pre› Заранее спасибо за внимание.   -  person merve    schedule 04.01.2011


Ответы (2)


По вашим комментариям я не уверен, удовлетворены ли вы ответом, данным на форумах prefuse. Поэтому я поигрался с кодом и со следующими изменениями смог получить желаемое поведение.

Я изменил входной xml так, чтобы был направлен edgedefault элемента графа.

... <graph edgedefault="directed"> ...

Затем в коде я играл с различными типами краев и стрелок EdgeRenderer, просто чтобы убедиться, что я могу включать и выключать стрелки или заставить их отображаться вперед или назад. Я также пробовал изогнутые линии. Например:

edgeRenderer = new EdgeRenderer(prefuse.Constants.EDGE_TYPE_CURVE, prefuse.Constants.EDGE_ARROW_FORWARD);

Опять же, возможно, вы уже получили ответ на этот вопрос на других форумах.

person ditkin    schedule 24.04.2011

Я наткнулся на тот же вопрос. Для будущих пользователей библиотеки prefuse, которые только начинают: если вы хотите добавить стрелки в пример RadialGraphView, вам нужно внести изменения, упомянутые ditkin, и добавить строку:

ColorAction arrowColor = new ColorAction("tree.edges", VisualItem.FILLCOLOR, ColorLib.gray(200));

и далее ниже:

// create the filtering and layout:
[...]
filter.add(arrowColor); // add this one

По сути, ответ находится в ветке sourceforge, но я хотел предоставить решение здесь. Код от мерве содержит эти инструкции.

person remipod    schedule 06.01.2012