Created
September 24, 2009 00:28
-
-
Save aalmiray/192396 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// JUNG2 http://jung.sourceforge.net | |
// JSilhouette http://code.google.com/p/jsilhouette | |
// Groovy http://groovy.codehaus.org | |
import edu.uci.ics.jung.graph.* | |
import edu.uci.ics.jung.visualization.* | |
import edu.uci.ics.jung.visualization.decorators.* | |
import edu.uci.ics.jung.visualization.renderers.* | |
import edu.uci.ics.jung.visualization.util.* | |
import edu.uci.ics.jung.algorithms.layout.* | |
import org.apache.commons.collections15.Transformer | |
import org.apache.commons.collections15.functors.ConstantTransformer | |
import java.awt.geom.Rectangle2D | |
import java.awt.geom.AffineTransform | |
import java.awt.Shape | |
import java.awt.Color | |
import java.awt.Paint | |
import groovy.swing.SwingBuilder | |
import org.kordamp.jsilhouette.geom.* | |
class JSilhouetteVertexShapeFactory<V> extends VertexShapeFactory<V> { | |
JSilhouetteVertexShapeFactory() { | |
super() | |
} | |
JSilhouetteVertexShapeFactory(Transformer<V,Integer> vsf, Transformer<V,Float> varf) { | |
super(vsf, varf) | |
} | |
Shape getStar(V v, int count) { | |
Rectangle2D frame = getRectangle(v) | |
float width = frame.width as float | |
float height = frame.height as float | |
Star star = new Star(frame.x as float, | |
frame.y as float, | |
(frame.width/2) as float, | |
(frame.width*3/8) as float, | |
count) | |
return normalize(v, star, width, height) | |
} | |
private Shape normalize(V v, Shape shape, float width, float height) { | |
Rectangle2D r = shape.bounds2D | |
double tx = r.minX + r.width/2 | |
double ty = r.minY + r.height/2 | |
AffineTransform at = AffineTransform.getTranslateInstance(-ty, -tx) | |
return at.createTransformedShape(shape) | |
} | |
} | |
abstract class JSilhouetteVertexShapeTransformer<V> implements SettableVertexShapeTransformer<V> { | |
protected Transformer<V,Integer> vsf | |
protected Transformer<V,Float> varf | |
protected JSilhouetteVertexShapeFactory<V> factory | |
static final int DEFAULT_SIZE = 8i | |
static final float DEFAULT_ASPECT_RATIO = 1.0f | |
JSilhouetteVertexShapeTransformer(Transformer<V,Integer> vsf, Transformer<V,Float> varf) { | |
this.vsf = vsf | |
this.varf = varf | |
factory = new JSilhouetteVertexShapeFactory<V>(vsf, varf) | |
} | |
JSilhouetteVertexShapeTransformer() { | |
this(new ConstantTransformer(DEFAULT_SIZE), new ConstantTransformer(DEFAULT_ASPECT_RATIO)) | |
} | |
void setSizeTransformer(Transformer<V,Integer> vsf) { | |
this.vsf = vsf | |
factory = new JSilhouetteVertexShapeFactory<V>(vsf, varf) | |
} | |
void setAspectRatioTransformer(Transformer<V,Integer> varf) { | |
this.varf = varf | |
factory = new JSilhouetteVertexShapeFactory<V>(vsf, varf) | |
} | |
} | |
class StarVertexShapeTransformer<V> extends JSilhouetteVertexShapeTransformer<V> implements Transformer<V,Shape> { | |
private final Transformer<V,Integer> countExtractor | |
private static final Transformer<V,Integer> DEFAULT_EXTRACTOR = { v -> | |
int count = 0 | |
if(v instanceof Number) count = v.intValue() | |
return count > 1 ? count : 2 | |
} as Transformer<V,Integer> | |
StarVertexShapeTransformer() { | |
this(DEFAULT_EXTRACTOR) | |
} | |
StarVertexShapeTransformer(Transformer<V,Integer> vsf, Transformer<V,Float> varf) { | |
this(vsf, varf, DEFAULT_EXTRACTOR) | |
} | |
StarVertexShapeTransformer(Transformer<V,Integer> cx) { | |
super() | |
countExtractor = cx | |
} | |
StarVertexShapeTransformer(Transformer<V,Integer> vsf, Transformer<V,Float> varf, Transformer<V,Integer> cx) { | |
super(vsf, varf) | |
countExtractor = cx | |
} | |
Shape transform(V v) { | |
factory.getStar(v, countExtractor.transform(v)) | |
} | |
} | |
int max = 10 | |
Graph<Integer, String> g = new SparseMultigraph<Integer, String>() | |
(1..max).each { Integer i -> g.addVertex(i) } | |
(1..<max).each { Integer x -> g.addEdge("Edge-$x", x, x+1) } | |
g.addEdge("Edge-${max}", max, 1) | |
def colorMap = [:] | |
Random r = new Random() | |
def paintTransformer = { Integer i -> | |
colorMap.get(i, new Color(r.nextInt(128)+128i, r.nextInt(128)+128i, r.nextInt(128)+128i)) | |
} as Transformer<Integer,Paint> | |
def swing = new SwingBuilder() | |
swing.edt { | |
frame(title: "JUNG2", pack: true, visible: true) { | |
bean(id: "glayout", new CircleLayout(g), size: [330,330]) | |
widget(id: "gview", new BasicVisualizationServer<Integer, String>(glayout), preferredSize: [350,350]) | |
bean(id: "starrer", new StarVertexShapeTransformer<Integer>(), sizeTransformer: new ConstantTransformer(40i)) | |
bean(gview.renderContext, vertexShapeTransformer: starrer, edgeLabelTransformer: new ToStringLabeller(), | |
vertexLabelTransformer: new ToStringLabeller(), vertexFillPaintTransformer: paintTransformer) | |
bean(gview.renderer.vertexLabelRenderer, position: Renderer.VertexLabel.Position.CNTR) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment