home *** CD-ROM | disk | FTP | other *** search
- import java.awt.Color;
- import java.awt.Component;
- import java.awt.Dimension;
- import java.awt.Event;
- import java.awt.FontMetrics;
- import java.awt.Graphics;
- import java.awt.Image;
- import java.awt.Panel;
- import java.awt.image.ImageObserver;
-
- class GraphPanel extends Panel implements Runnable {
- Node[] nodes = new Node[100];
- Edge[] edges = new Edge[200];
- Thread relaxer;
- Graph graph;
- int nnodes;
- int nedges;
- boolean stress;
- boolean random;
- Node pick;
- boolean pickfixed;
- Image offscreen;
- Dimension offscreensize;
- Graphics offgraphics;
- final Color fixedColor;
- final Color selectColor;
- final Color edgeColor;
- final Color nodeColor;
- final Color stressColor;
- final Color arcColor1;
- final Color arcColor2;
- final Color arcColor3;
-
- GraphPanel(Graph var1) {
- this.fixedColor = Color.red;
- this.selectColor = Color.pink;
- this.edgeColor = Color.black;
- this.nodeColor = new Color(250, 220, 100);
- this.stressColor = Color.darkGray;
- this.arcColor1 = Color.black;
- this.arcColor2 = Color.pink;
- this.arcColor3 = Color.red;
- this.graph = var1;
- }
-
- int findNode(String var1) {
- for(int var2 = 0; var2 < this.nnodes; ++var2) {
- if (this.nodes[var2].lbl.equals(var1)) {
- return var2;
- }
- }
-
- return this.addNode(var1);
- }
-
- int addNode(String var1) {
- Node var2 = new Node();
- var2.x = (double)10.0F + (double)380.0F * Math.random();
- var2.y = (double)10.0F + (double)380.0F * Math.random();
- var2.lbl = var1;
- this.nodes[this.nnodes] = var2;
- return this.nnodes++;
- }
-
- void addEdge(String var1, String var2, int var3) {
- Edge var4 = new Edge();
- var4.from = this.findNode(var1);
- var4.to = this.findNode(var2);
- var4.len = (double)var3;
- this.edges[this.nedges++] = var4;
- }
-
- public void run() {
- while(true) {
- this.relax();
- if (this.random && Math.random() < 0.03) {
- Node var1 = this.nodes[(int)(Math.random() * (double)this.nnodes)];
- if (!var1.fixed) {
- var1.x += (double)100.0F * Math.random() - (double)50.0F;
- var1.y += (double)100.0F * Math.random() - (double)50.0F;
- }
-
- this.graph.play(this.graph.getCodeBase(), "audio/drip.au");
- }
-
- try {
- Thread.sleep(100L);
- } catch (InterruptedException var2) {
- return;
- }
- }
- }
-
- synchronized void relax() {
- for(int var1 = 0; var1 < this.nedges; ++var1) {
- Edge var2 = this.edges[var1];
- double var3 = this.nodes[var2.to].x - this.nodes[var2.from].x;
- double var5 = this.nodes[var2.to].y - this.nodes[var2.from].y;
- double var7 = Math.sqrt(var3 * var3 + var5 * var5);
- double var9 = (this.edges[var1].len - var7) / (var7 * (double)3.0F);
- double var11 = var9 * var3;
- double var13 = var9 * var5;
- Node var10000 = this.nodes[var2.to];
- var10000.dx += var11;
- var10000 = this.nodes[var2.to];
- var10000.dy += var13;
- var10000 = this.nodes[var2.from];
- var10000.dx += -var11;
- var10000 = this.nodes[var2.from];
- var10000.dy += -var13;
- }
-
- for(int var16 = 0; var16 < this.nnodes; ++var16) {
- Node var17 = this.nodes[var16];
- double var4 = (double)0.0F;
- double var6 = (double)0.0F;
-
- for(int var8 = 0; var8 < this.nnodes; ++var8) {
- if (var16 != var8) {
- Node var21 = this.nodes[var8];
- double var10 = var17.x - var21.x;
- double var12 = var17.y - var21.y;
- double var14 = var10 * var10 + var12 * var12;
- if (var14 == (double)0.0F) {
- var4 += Math.random();
- var6 += Math.random();
- } else if (var14 < (double)10000.0F) {
- var4 += var10 / var14;
- var6 += var12 / var14;
- }
- }
- }
-
- double var22 = var4 * var4 + var6 * var6;
- if (var22 > (double)0.0F) {
- var22 = Math.sqrt(var22) / (double)2.0F;
- var17.dx += var4 / var22;
- var17.dy += var6 / var22;
- }
- }
-
- Dimension var18 = ((Component)this).size();
-
- for(int var19 = 0; var19 < this.nnodes; ++var19) {
- Node var20 = this.nodes[var19];
- if (!var20.fixed) {
- var20.x += Math.max((double)-5.0F, Math.min((double)5.0F, var20.dx));
- var20.y += Math.max((double)-5.0F, Math.min((double)5.0F, var20.dy));
- if (var20.x < (double)0.0F) {
- var20.x = (double)0.0F;
- } else if (var20.x > (double)var18.width) {
- var20.x = (double)var18.width;
- }
-
- if (var20.y < (double)0.0F) {
- var20.y = (double)0.0F;
- } else if (var20.y > (double)var18.height) {
- var20.y = (double)var18.height;
- }
- }
-
- var20.dx /= (double)2.0F;
- var20.dy /= (double)2.0F;
- }
-
- ((Component)this).repaint();
- }
-
- public void paintNode(Graphics var1, Node var2, FontMetrics var3) {
- int var4 = (int)var2.x;
- int var5 = (int)var2.y;
- var1.setColor(var2 == this.pick ? this.selectColor : (var2.fixed ? this.fixedColor : this.nodeColor));
- int var6 = var3.stringWidth(var2.lbl) + 10;
- int var7 = var3.getHeight() + 4;
- var1.fillRect(var4 - var6 / 2, var5 - var7 / 2, var6, var7);
- var1.setColor(Color.black);
- var1.drawRect(var4 - var6 / 2, var5 - var7 / 2, var6 - 1, var7 - 1);
- var1.drawString(var2.lbl, var4 - (var6 - 10) / 2, var5 - (var7 - 4) / 2 + var3.getAscent());
- }
-
- public synchronized void update(Graphics var1) {
- Dimension var2 = ((Component)this).size();
- if (this.offscreen == null || var2.width != this.offscreensize.width || var2.height != this.offscreensize.height) {
- this.offscreen = ((Component)this).createImage(var2.width, var2.height);
- this.offscreensize = var2;
- this.offgraphics = this.offscreen.getGraphics();
- this.offgraphics.setFont(((Component)this).getFont());
- }
-
- this.offgraphics.setColor(((Component)this).getBackground());
- this.offgraphics.fillRect(0, 0, var2.width, var2.height);
-
- for(int var3 = 0; var3 < this.nedges; ++var3) {
- Edge var4 = this.edges[var3];
- int var5 = (int)this.nodes[var4.from].x;
- int var6 = (int)this.nodes[var4.from].y;
- int var7 = (int)this.nodes[var4.to].x;
- int var8 = (int)this.nodes[var4.to].y;
- int var9 = (int)Math.abs(Math.sqrt((double)((var5 - var7) * (var5 - var7) + (var6 - var8) * (var6 - var8))) - var4.len);
- this.offgraphics.setColor(var9 < 10 ? this.arcColor1 : (var9 < 20 ? this.arcColor2 : this.arcColor3));
- this.offgraphics.drawLine(var5, var6, var7, var8);
- if (this.stress) {
- String var10 = String.valueOf(var9);
- this.offgraphics.setColor(this.stressColor);
- this.offgraphics.drawString(var10, var5 + (var7 - var5) / 2, var6 + (var8 - var6) / 2);
- this.offgraphics.setColor(this.edgeColor);
- }
- }
-
- FontMetrics var11 = this.offgraphics.getFontMetrics();
-
- for(int var12 = 0; var12 < this.nnodes; ++var12) {
- this.paintNode(this.offgraphics, this.nodes[var12], var11);
- }
-
- var1.drawImage(this.offscreen, 0, 0, (ImageObserver)null);
- }
-
- public synchronized boolean mouseDown(Event var1, int var2, int var3) {
- double var4 = Double.MAX_VALUE;
-
- for(int var6 = 0; var6 < this.nnodes; ++var6) {
- Node var7 = this.nodes[var6];
- double var8 = (var7.x - (double)var2) * (var7.x - (double)var2) + (var7.y - (double)var3) * (var7.y - (double)var3);
- if (var8 < var4) {
- this.pick = var7;
- var4 = var8;
- }
- }
-
- this.pickfixed = this.pick.fixed;
- this.pick.fixed = true;
- this.pick.x = (double)var2;
- this.pick.y = (double)var3;
- ((Component)this).repaint();
- return true;
- }
-
- public synchronized boolean mouseDrag(Event var1, int var2, int var3) {
- this.pick.x = (double)var2;
- this.pick.y = (double)var3;
- ((Component)this).repaint();
- return true;
- }
-
- public synchronized boolean mouseUp(Event var1, int var2, int var3) {
- this.pick.x = (double)var2;
- this.pick.y = (double)var3;
- this.pick.fixed = this.pickfixed;
- this.pick = null;
- ((Component)this).repaint();
- return true;
- }
-
- public void start() {
- this.relaxer = new Thread(this);
- this.relaxer.start();
- }
-
- public void stop() {
- this.relaxer.stop();
- }
- }
-