home *** CD-ROM | disk | FTP | other *** search
/ CD Actual Thematic 7: Programming / CDAT7.iso / Share / Java / Bluette / Plastic / demo / GraphPanel.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-09-03  |  5.8 KB  |  264 lines

  1. import java.awt.Color;
  2. import java.awt.Component;
  3. import java.awt.Dimension;
  4. import java.awt.Event;
  5. import java.awt.FontMetrics;
  6. import java.awt.Graphics;
  7. import java.awt.Image;
  8. import java.awt.Panel;
  9. import java.awt.image.ImageObserver;
  10.  
  11. class GraphPanel extends Panel implements Runnable {
  12.    Node[] nodes = new Node[100];
  13.    Edge[] edges = new Edge[200];
  14.    Thread relaxer;
  15.    Graph graph;
  16.    int nnodes;
  17.    int nedges;
  18.    boolean stress;
  19.    boolean random;
  20.    Node pick;
  21.    boolean pickfixed;
  22.    Image offscreen;
  23.    Dimension offscreensize;
  24.    Graphics offgraphics;
  25.    final Color fixedColor;
  26.    final Color selectColor;
  27.    final Color edgeColor;
  28.    final Color nodeColor;
  29.    final Color stressColor;
  30.    final Color arcColor1;
  31.    final Color arcColor2;
  32.    final Color arcColor3;
  33.  
  34.    GraphPanel(Graph var1) {
  35.       this.fixedColor = Color.red;
  36.       this.selectColor = Color.pink;
  37.       this.edgeColor = Color.black;
  38.       this.nodeColor = new Color(250, 220, 100);
  39.       this.stressColor = Color.darkGray;
  40.       this.arcColor1 = Color.black;
  41.       this.arcColor2 = Color.pink;
  42.       this.arcColor3 = Color.red;
  43.       this.graph = var1;
  44.    }
  45.  
  46.    int findNode(String var1) {
  47.       for(int var2 = 0; var2 < this.nnodes; ++var2) {
  48.          if (this.nodes[var2].lbl.equals(var1)) {
  49.             return var2;
  50.          }
  51.       }
  52.  
  53.       return this.addNode(var1);
  54.    }
  55.  
  56.    int addNode(String var1) {
  57.       Node var2 = new Node();
  58.       var2.x = (double)10.0F + (double)380.0F * Math.random();
  59.       var2.y = (double)10.0F + (double)380.0F * Math.random();
  60.       var2.lbl = var1;
  61.       this.nodes[this.nnodes] = var2;
  62.       return this.nnodes++;
  63.    }
  64.  
  65.    void addEdge(String var1, String var2, int var3) {
  66.       Edge var4 = new Edge();
  67.       var4.from = this.findNode(var1);
  68.       var4.to = this.findNode(var2);
  69.       var4.len = (double)var3;
  70.       this.edges[this.nedges++] = var4;
  71.    }
  72.  
  73.    public void run() {
  74.       while(true) {
  75.          this.relax();
  76.          if (this.random && Math.random() < 0.03) {
  77.             Node var1 = this.nodes[(int)(Math.random() * (double)this.nnodes)];
  78.             if (!var1.fixed) {
  79.                var1.x += (double)100.0F * Math.random() - (double)50.0F;
  80.                var1.y += (double)100.0F * Math.random() - (double)50.0F;
  81.             }
  82.  
  83.             this.graph.play(this.graph.getCodeBase(), "audio/drip.au");
  84.          }
  85.  
  86.          try {
  87.             Thread.sleep(100L);
  88.          } catch (InterruptedException var2) {
  89.             return;
  90.          }
  91.       }
  92.    }
  93.  
  94.    synchronized void relax() {
  95.       for(int var1 = 0; var1 < this.nedges; ++var1) {
  96.          Edge var2 = this.edges[var1];
  97.          double var3 = this.nodes[var2.to].x - this.nodes[var2.from].x;
  98.          double var5 = this.nodes[var2.to].y - this.nodes[var2.from].y;
  99.          double var7 = Math.sqrt(var3 * var3 + var5 * var5);
  100.          double var9 = (this.edges[var1].len - var7) / (var7 * (double)3.0F);
  101.          double var11 = var9 * var3;
  102.          double var13 = var9 * var5;
  103.          Node var10000 = this.nodes[var2.to];
  104.          var10000.dx += var11;
  105.          var10000 = this.nodes[var2.to];
  106.          var10000.dy += var13;
  107.          var10000 = this.nodes[var2.from];
  108.          var10000.dx += -var11;
  109.          var10000 = this.nodes[var2.from];
  110.          var10000.dy += -var13;
  111.       }
  112.  
  113.       for(int var16 = 0; var16 < this.nnodes; ++var16) {
  114.          Node var17 = this.nodes[var16];
  115.          double var4 = (double)0.0F;
  116.          double var6 = (double)0.0F;
  117.  
  118.          for(int var8 = 0; var8 < this.nnodes; ++var8) {
  119.             if (var16 != var8) {
  120.                Node var21 = this.nodes[var8];
  121.                double var10 = var17.x - var21.x;
  122.                double var12 = var17.y - var21.y;
  123.                double var14 = var10 * var10 + var12 * var12;
  124.                if (var14 == (double)0.0F) {
  125.                   var4 += Math.random();
  126.                   var6 += Math.random();
  127.                } else if (var14 < (double)10000.0F) {
  128.                   var4 += var10 / var14;
  129.                   var6 += var12 / var14;
  130.                }
  131.             }
  132.          }
  133.  
  134.          double var22 = var4 * var4 + var6 * var6;
  135.          if (var22 > (double)0.0F) {
  136.             var22 = Math.sqrt(var22) / (double)2.0F;
  137.             var17.dx += var4 / var22;
  138.             var17.dy += var6 / var22;
  139.          }
  140.       }
  141.  
  142.       Dimension var18 = ((Component)this).size();
  143.  
  144.       for(int var19 = 0; var19 < this.nnodes; ++var19) {
  145.          Node var20 = this.nodes[var19];
  146.          if (!var20.fixed) {
  147.             var20.x += Math.max((double)-5.0F, Math.min((double)5.0F, var20.dx));
  148.             var20.y += Math.max((double)-5.0F, Math.min((double)5.0F, var20.dy));
  149.             if (var20.x < (double)0.0F) {
  150.                var20.x = (double)0.0F;
  151.             } else if (var20.x > (double)var18.width) {
  152.                var20.x = (double)var18.width;
  153.             }
  154.  
  155.             if (var20.y < (double)0.0F) {
  156.                var20.y = (double)0.0F;
  157.             } else if (var20.y > (double)var18.height) {
  158.                var20.y = (double)var18.height;
  159.             }
  160.          }
  161.  
  162.          var20.dx /= (double)2.0F;
  163.          var20.dy /= (double)2.0F;
  164.       }
  165.  
  166.       ((Component)this).repaint();
  167.    }
  168.  
  169.    public void paintNode(Graphics var1, Node var2, FontMetrics var3) {
  170.       int var4 = (int)var2.x;
  171.       int var5 = (int)var2.y;
  172.       var1.setColor(var2 == this.pick ? this.selectColor : (var2.fixed ? this.fixedColor : this.nodeColor));
  173.       int var6 = var3.stringWidth(var2.lbl) + 10;
  174.       int var7 = var3.getHeight() + 4;
  175.       var1.fillRect(var4 - var6 / 2, var5 - var7 / 2, var6, var7);
  176.       var1.setColor(Color.black);
  177.       var1.drawRect(var4 - var6 / 2, var5 - var7 / 2, var6 - 1, var7 - 1);
  178.       var1.drawString(var2.lbl, var4 - (var6 - 10) / 2, var5 - (var7 - 4) / 2 + var3.getAscent());
  179.    }
  180.  
  181.    public synchronized void update(Graphics var1) {
  182.       Dimension var2 = ((Component)this).size();
  183.       if (this.offscreen == null || var2.width != this.offscreensize.width || var2.height != this.offscreensize.height) {
  184.          this.offscreen = ((Component)this).createImage(var2.width, var2.height);
  185.          this.offscreensize = var2;
  186.          this.offgraphics = this.offscreen.getGraphics();
  187.          this.offgraphics.setFont(((Component)this).getFont());
  188.       }
  189.  
  190.       this.offgraphics.setColor(((Component)this).getBackground());
  191.       this.offgraphics.fillRect(0, 0, var2.width, var2.height);
  192.  
  193.       for(int var3 = 0; var3 < this.nedges; ++var3) {
  194.          Edge var4 = this.edges[var3];
  195.          int var5 = (int)this.nodes[var4.from].x;
  196.          int var6 = (int)this.nodes[var4.from].y;
  197.          int var7 = (int)this.nodes[var4.to].x;
  198.          int var8 = (int)this.nodes[var4.to].y;
  199.          int var9 = (int)Math.abs(Math.sqrt((double)((var5 - var7) * (var5 - var7) + (var6 - var8) * (var6 - var8))) - var4.len);
  200.          this.offgraphics.setColor(var9 < 10 ? this.arcColor1 : (var9 < 20 ? this.arcColor2 : this.arcColor3));
  201.          this.offgraphics.drawLine(var5, var6, var7, var8);
  202.          if (this.stress) {
  203.             String var10 = String.valueOf(var9);
  204.             this.offgraphics.setColor(this.stressColor);
  205.             this.offgraphics.drawString(var10, var5 + (var7 - var5) / 2, var6 + (var8 - var6) / 2);
  206.             this.offgraphics.setColor(this.edgeColor);
  207.          }
  208.       }
  209.  
  210.       FontMetrics var11 = this.offgraphics.getFontMetrics();
  211.  
  212.       for(int var12 = 0; var12 < this.nnodes; ++var12) {
  213.          this.paintNode(this.offgraphics, this.nodes[var12], var11);
  214.       }
  215.  
  216.       var1.drawImage(this.offscreen, 0, 0, (ImageObserver)null);
  217.    }
  218.  
  219.    public synchronized boolean mouseDown(Event var1, int var2, int var3) {
  220.       double var4 = Double.MAX_VALUE;
  221.  
  222.       for(int var6 = 0; var6 < this.nnodes; ++var6) {
  223.          Node var7 = this.nodes[var6];
  224.          double var8 = (var7.x - (double)var2) * (var7.x - (double)var2) + (var7.y - (double)var3) * (var7.y - (double)var3);
  225.          if (var8 < var4) {
  226.             this.pick = var7;
  227.             var4 = var8;
  228.          }
  229.       }
  230.  
  231.       this.pickfixed = this.pick.fixed;
  232.       this.pick.fixed = true;
  233.       this.pick.x = (double)var2;
  234.       this.pick.y = (double)var3;
  235.       ((Component)this).repaint();
  236.       return true;
  237.    }
  238.  
  239.    public synchronized boolean mouseDrag(Event var1, int var2, int var3) {
  240.       this.pick.x = (double)var2;
  241.       this.pick.y = (double)var3;
  242.       ((Component)this).repaint();
  243.       return true;
  244.    }
  245.  
  246.    public synchronized boolean mouseUp(Event var1, int var2, int var3) {
  247.       this.pick.x = (double)var2;
  248.       this.pick.y = (double)var3;
  249.       this.pick.fixed = this.pickfixed;
  250.       this.pick = null;
  251.       ((Component)this).repaint();
  252.       return true;
  253.    }
  254.  
  255.    public void start() {
  256.       this.relaxer = new Thread(this);
  257.       this.relaxer.start();
  258.    }
  259.  
  260.    public void stop() {
  261.       this.relaxer.stop();
  262.    }
  263. }
  264.