可以使用JGraphT java库来制作3D图形

时间:2016-06-28 11:39:35

标签: java jgrapht

基本上我必须从顶点列表中绘制一个3D无向图。目前我可以在2D中绘制一个无向图,我已经使用了以下代码。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.geom.Rectangle2D;
import java.util.HashMap;
import java.util.Map;

import javax.swing.JApplet;
import javax.swing.JFrame;

import org.jgraph.JGraph;
import org.jgraph.graph.DefaultGraphCell;
import org.jgraph.graph.GraphConstants;

import org.jgrapht.ListenableGraph;
import org.jgrapht.ext.JGraphModelAdapter;
import org.jgrapht.graph.ListenableDirectedGraph;
import org.jgrapht.graph.DefaultEdge;


public class JGraphAdapterDemo extends JApplet {
private static final Color     DEFAULT_BG_COLOR = Color.decode( "#FAFBFF" );
private static final Dimension DEFAULT_SIZE = new Dimension( 530, 320 );

// 
private JGraphModelAdapter m_jgAdapter;

/**
 * @see java.applet.Applet#init().
 */
public void init(  ) {
    // create a JGraphT graph
    ListenableGraph g = new ListenableDirectedGraph( DefaultEdge.class );

    // create a visualization using JGraph, via an adapter
    m_jgAdapter = new JGraphModelAdapter( g );

    JGraph jgraph = new JGraph( m_jgAdapter );

    adjustDisplaySettings( jgraph );
    getContentPane(  ).add( jgraph );
    resize( DEFAULT_SIZE );

    // add some sample data (graph manipulated via JGraphT)
    g.addVertex( "v1" );
    g.addVertex( "v2" );
    g.addVertex( "v3" );
    g.addVertex( "v4" );

    g.addEdge( "v1", "v2" );
    g.addEdge( "v2", "v3" );
    g.addEdge( "v3", "v1" );
    g.addEdge( "v4", "v3" );

    // position vertices nicely within JGraph component
    positionVertexAt( "v1", 50, 50 );
    positionVertexAt( "v2", 120, 120 );
    positionVertexAt( "v3", 200,200 );
    positionVertexAt( "v4", 20, 20 );

    // that's all there is to it!...
}


private void adjustDisplaySettings( JGraph jg ) {
    jg.setPreferredSize( DEFAULT_SIZE );

    Color  c        = DEFAULT_BG_COLOR;
    String colorStr = null;

    try {
        colorStr = getParameter( "bgcolor" );
    }
     catch( Exception e ) {}

    if( colorStr != null ) {
        c = Color.decode( colorStr );
    }

    jg.setBackground( c );
}


private void positionVertexAt( Object vertex, int x, int y ) {
    DefaultGraphCell cell = m_jgAdapter.getVertexCell( vertex );
    Map attr = cell.getAttributes(  );
    Rectangle2D b = GraphConstants.getBounds(attr);

    GraphConstants.setBounds( attr, new Rectangle( x, y, b.OUT_BOTTOM, b.OUT_TOP ) );

    Map cellAttr = new HashMap(  );
    cellAttr.put( cell, attr );
    m_jgAdapter.edit( cellAttr, null, null, null);
}
}

现在我想知道的是,我们可以使用JGraphT库扩展此代码并在3D中绘制无向图。除此之外还有其他任何对我来说更有用的工作。

1 个答案:

答案 0 :(得分:0)

我已成功实现了上述任务。我没有使用JGraphT库完成它,而是仅使用Java 3D完成它。下面是显示使用Java 3D制作的四面体的3D无向图的代码。 / p>

import javax.media.j3d.Appearance;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.GeometryArray;
import javax.media.j3d.LineStripArray;
import javax.media.j3d.Shape3D;
import javax.media.j3d.TransformGroup;
import javax.vecmath.Point3d;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.universe.SimpleUniverse;


public class test {

public test(){

SimpleUniverse u=new SimpleUniverse(); 

BranchGroup group=new BranchGroup();

Point3d coords[] = new Point3d[9];

Appearance app=new Appearance();

coords[0] = new Point3d(0.5d, 0.5d, 0.5d);
coords[1] = new Point3d(1.0d, 0.5d, 0.5d);
coords[2] = new Point3d(0.5d, 0.5d, 0.5d);
coords[3] = new Point3d(0.5d, 1.0d, 0.5d);
coords[4] = new Point3d(0.5d, 0.5d, 0.5d);
coords[5] = new Point3d(0.5d, 0.5d, 1.0d);
coords[6] = new Point3d(1.0d, 0.5d, 0.5d);
coords[7] = new Point3d(0.5d, 1.0d, 0.5d);
coords[8] = new Point3d(0.5d, 0.5d, 1.0d);

 int vertexCounts[] = {9};

 LineStripArray lines = new LineStripArray(9,
 GeometryArray.COORDINATES, vertexCounts);

 lines.setCoordinates(0, coords);

Shape3D shape=new Shape3D(lines , app);

//group.addChild(shape);

TransformGroup objRotate = new TransformGroup();
objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
objRotate.addChild(shape);

MouseRotate f1=new MouseRotate();
f1.setSchedulingBounds(new BoundingSphere());
f1.setTransformGroup(objRotate);
group.addChild(f1);

group.addChild(objRotate);

u.addBranchGraph(group);

u.getViewingPlatform().setNominalViewingTransform();

}

}

使用此实现的四面体图像如下:

enter image description here