2015-05-25 2 views
2

Как here, мой график Prefuse слишком плотный, чтобы что-либо увидеть. Поэтому я попробовал подход, предложенный @bcr в принятом ответе. Однако это не работает для меня. Это то, что я пробовал:График предварительной обработки вручную задает параметры силы

Я получил настройки по умолчанию. Затем я изменил второй параметр NBodyForce от ForceSimulator (так называемый Distance) и второй параметр SpringForce (называемый DefaultSpringLength) и подал их вместе с другими значениями по умолчанию - в мой новый ForceSimulator. Но ничто в выходе не изменилось. Что я ошибаюсь?

Это мой код:

private static void visualiseGraph(Graph graph) { 
    Visualization vis = new Visualization(); 
    vis.add("graph", graph); 
    LabelRenderer r = new LabelRenderer("someLabel"); 
    r.setRoundedCorner(8, 8); 
    vis.setRendererFactory(new DefaultRendererFactory(r)); 
    ColorAction fill = new ColorAction("graph.nodes", 
      VisualItem.FILLCOLOR, ColorLib.rgb(190,190,255)); 
    ColorAction text = new ColorAction("graph.nodes", 
     VisualItem.TEXTCOLOR, ColorLib.gray(0)); 
    ColorAction edges = new ColorAction("graph.edges", 
     VisualItem.STROKECOLOR, ColorLib.rgb(255,180,180)); 
    ActionList color = new ActionList(); 
    color.add(fill); 
    color.add(text); 
    color.add(edges); 
    ActionList layout = new ActionList(Activity.INFINITY); 
    Force[] originalForces = new ForceDirectedLayout("").getForceSimulator().getForces(); 
    ForceDirectedLayout fdl = new ForceDirectedLayout("graph"){ 
     @Override 
     public ForceSimulator getForceSimulator() { 
      ForceSimulator fs = new ForceSimulator(); 
      fs.addForce(new NBodyForce(originalForces[0].getParameter(0), 100, originalForces[0].getParameter(2))); 
      fs.addForce(originalForces[1]); 
      fs.addForce(new SpringForce(originalForces[2].getParameter(0), 100)); 
      return fs; 
     } 
    }; 
    layout.add(fdl); 
    layout.add(new RepaintAction()); 
    vis.putAction("color", color); 
    vis.putAction("layout", layout); 
    Display display = new Display(vis) { 
     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(W, H); 
     } 
    }; 
    display.pan(W/2, H/2); 
    display.addControlListener(new DragControl()); // drag items around 
    display.addControlListener(new PanControl()); // pan with background left-drag 
    display.addControlListener(new ZoomControl()); // zoom with vertical right-drag 
    JFrame frame = new JFrame("prefuse example"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.add(display); 
    frame.pack();   
    frame.setVisible(true); 
    vis.run("color"); 
    vis.run("layout"); 
} 

ответ

2

Один из подходов может добавить JForcePanel, который является свинг компонент

для настройки параметров в Force функций в данной ForceSimulator. Полезно для изучения различных параметров при создании визуализации.

Это может помочь вам найти оптимальные параметры для использования в вашей реализации getForceSimulator().

ForceSimulator fsim = ((ForceDirectedLayout) layout.get(0)).getForceSimulator(); 
JForcePanel fpanel = new JForcePanel(fsim); 
frame.add(fpanel, BorderLayout.SOUTH); 

Среди demos включенных в распределении, prefuse.demos.GraphView полный пример. Эмпирически кажется, что некоторые параметры имеют более или менее эффект в зависимости от выбранного набора данных.

Addendum: Подойдя ближе, я вижу, что ваш подход оставляет внутреннее состояние fdl без изменений. Вместо этого создайте новый ForceSimulator и используйте его в панели макета и силы; приведенный ниже пример изменяет defaultLengthSpringForce от DEFAULT_SPRING_LENGTH до 42.

ForceDirectedLayout fdl = new ForceDirectedLayout("graph"); 
ForceSimulator fs = new ForceSimulator(); 
fs.addForce(new NBodyForce()); 
fs.addForce(new DragForce()); 
fs.addForce(new SpringForce(DEFAULT_SPRING_COEFF, 42)); 
fdl.setForceSimulator(fs); 

В качестве альтернативы, обновить SpringForce непосредственно, как показано here.

ForceDirectedLayout fdl = new ForceDirectedLayout("graph"); 
ForceSimulator fs = fdl.getForceSimulator(); 
Force[] forces = fs.getForces(); 
SpringForce sf = (SpringForce) forces[2]; 
sf.setParameter(SPRING_LENGTH, 42); 

image

+0

Большое спасибо. JForcePanel очень полезен и забавная игрушка, устанавливая параметры сил так, как вы это делали. – anjuta

+0

комментарий для тех, кто может столкнуться с теми же проблемами, что и я: мне пришлось делать fs.addForce (новый SpringForce (SpringForce.DEFAULT_SPRING_COEFF, )); а конструкторы NBody и DragForces принимают только float, а не double, что по умолчанию используется в Java. – anjuta

+0

еще один комментарий: вы можете использовать значения из более широкого диапазона, чем предложенные JForcePanel, и они вступают в силу. – anjuta

Смежные вопросы