Skip to content

Instantly share code, notes, and snippets.

@aalmiray
Created September 24, 2009 06:33
Show Gist options
  • Save aalmiray/192559 to your computer and use it in GitHub Desktop.
Save aalmiray/192559 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
// improved over http://gist.github.com/192396
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.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 TemplateVertexShapeTransformer<V> extends AbstractVertexShapeTransformer<V> implements Transformer<V,Shape> {
private final Shape template
private final vertexCache = new WeakHashMap<V,Shape>()
TemplateVertexShapeTransformer(Shape template = new Rectangle2D.Double(0d, 0d, 1d, 1d)) {
super()
this.template = template
}
TemplateVertexShapeTransformer(Transformer<V,Integer> vsf, Transformer<V,Float> varf, Shape template = new Rectangle2D.Double(0d, 0d, 1d, 1d)) {
super(vsf, varf)
this.template = template
}
Shape transform(V v) {
Shape shape = vertexCache.get(v)
if(!shape) {
shape = createShape(v)
vertexCache.put(v, shape)
}
return shape
}
private Shape createShape(V v) {
Rectangle2D bounds = factory.getRectangle(v)
Rectangle2D tbounds = template.bounds2D
double s = Math.min(bounds.width/tbounds.width, bounds.height/tbounds.height)
double tx = tbounds.minX + tbounds.width/2
double ty = tbounds.minY + tbounds.height/2
AffineTransform at = AffineTransform.getScaleInstance(s, s)
at.translate(-tx,-ty)
return at.createTransformedShape(template)
}
}
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(64)+192i, 0i, 0i))
} 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: "star", new Star(), or: 40f, ir: 20f, count: 5i)
bean(id: "starrer", new TemplateVertexShapeTransformer<Integer>(star), sizeTransformer: new ConstantTransformer(40i))
bean(gview.renderContext, vertexShapeTransformer: starrer, edgeLabelTransformer: new ToStringLabeller(),
vertexLabelTransformer: new ToStringLabeller(), vertexFillPaintTransformer: paintTransformer)
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