基本上我必须从顶点列表中绘制一个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中绘制无向图。除此之外还有其他任何对我来说更有用的工作。
答案 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();
}
}
使用此实现的四面体图像如下: