Skip to content

Instantly share code, notes, and snippets.

@aalmiray
Created September 24, 2009 00:28
Show Gist options
  • Save aalmiray/192396 to your computer and use it in GitHub Desktop.
Save aalmiray/192396 to your computer and use it in GitHub Desktop.
// 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