annotate sample/graph/Graph.java @ 76:97ca5f5447cd

*** empty log message ***
author pin
date Tue, 04 Dec 2007 10:33:06 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
76
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
1 package sample.graph;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
2
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
3 /*
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
4 * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
5 *
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
7 * modification, are permitted provided that the following conditions
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
8 * are met:
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
9 *
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
10 * -Redistributions of source code must retain the above copyright
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
11 * notice, this list of conditions and the following disclaimer.
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
12 *
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
13 * -Redistribution in binary form must reproduct the above copyright
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
14 * notice, this list of conditions and the following disclaimer in
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
15 * the documentation and/or other materials provided with the distribution.
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
16 *
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
17 * Neither the name of Sun Microsystems, Inc. or the names of contributors
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
18 * may be used to endorse or promote products derived from this software
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
19 * without specific prior written permission.
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
20 *
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
21 * This software is provided "AS IS," without a warranty of any kind. ALL
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
22 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
23 * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
24 * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
25 * BE LIABLE FOR ANY DAMAGES OR LIABILITIES SUFFERED BY LICENSEE AS A RESULT
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
26 * OF OR RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR ITS
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
27 * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
28 * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
29 * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
30 * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
31 * IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
32 *
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
33 * You acknowledge that Software is not designed, licensed or intended for
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
34 * use in the design, construction, operation or maintenance of any nuclear
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
35 * facility.
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
36 */
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
37
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
38 /*
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
39 * @(#)Graph.java 1.13 03/01/23
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
40 */
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
41
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
42 import java.util.*;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
43 import java.awt.*;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
44 import java.applet.Applet;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
45 import java.awt.event.*;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
46
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
47
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
48 class Node {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
49 double x;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
50 double y;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
51
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
52 double dx;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
53 double dy;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
54
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
55 boolean fixed;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
56
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
57 String lbl;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
58 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
59
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
60
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
61 class Edge {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
62 int from;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
63 int to;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
64
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
65 double len;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
66 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
67
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
68
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
69 class GraphPanel extends Panel
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
70 implements Runnable, MouseListener, MouseMotionListener {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
71 Graph graph;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
72 int nnodes;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
73 Node nodes[] = new Node[100];
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
74
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
75 int nedges;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
76 Edge edges[] = new Edge[200];
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
77
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
78 Thread relaxer;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
79 boolean stress;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
80 boolean random;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
81
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
82 GraphPanel(Graph graph) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
83 this.graph = graph;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
84 addMouseListener(this);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
85 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
86
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
87 int findNode(String lbl) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
88 for (int i = 0 ; i < nnodes ; i++) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
89 if (nodes[i].lbl.equals(lbl)) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
90 return i;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
91 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
92 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
93 return addNode(lbl);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
94 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
95 int addNode(String lbl) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
96 Node n = new Node();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
97 n.x = 10 + 380*Math.random();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
98 n.y = 10 + 380*Math.random();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
99 n.lbl = lbl;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
100 nodes[nnodes] = n;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
101 return nnodes++;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
102 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
103 void addEdge(String from, String to, int len) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
104 Edge e = new Edge();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
105 e.from = findNode(from);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
106 e.to = findNode(to);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
107 e.len = len;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
108 edges[nedges++] = e;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
109 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
110
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
111 public void run() {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
112 Thread me = Thread.currentThread();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
113 while (relaxer == me) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
114 relax();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
115 if (random && (Math.random() < 0.03)) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
116 Node n = nodes[(int)(Math.random() * nnodes)];
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
117 if (!n.fixed) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
118 n.x += 100*Math.random() - 50;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
119 n.y += 100*Math.random() - 50;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
120 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
121 graph.play(graph.getCodeBase(), "audio/drip.au");
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
122 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
123 try {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
124 Thread.sleep(100);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
125 } catch (InterruptedException e) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
126 break;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
127 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
128 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
129 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
130
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
131 synchronized void relax() {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
132 for (int i = 0 ; i < nedges ; i++) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
133 Edge e = edges[i];
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
134 double vx = nodes[e.to].x - nodes[e.from].x;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
135 double vy = nodes[e.to].y - nodes[e.from].y;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
136 double len = Math.sqrt(vx * vx + vy * vy);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
137 len = (len == 0) ? .0001 : len;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
138 double f = (edges[i].len - len) / (len * 3);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
139 double dx = f * vx;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
140 double dy = f * vy;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
141
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
142 nodes[e.to].dx += dx;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
143 nodes[e.to].dy += dy;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
144 nodes[e.from].dx += -dx;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
145 nodes[e.from].dy += -dy;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
146 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
147
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
148 for (int i = 0 ; i < nnodes ; i++) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
149 Node n1 = nodes[i];
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
150 double dx = 0;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
151 double dy = 0;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
152
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
153 for (int j = 0 ; j < nnodes ; j++) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
154 if (i == j) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
155 continue;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
156 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
157 Node n2 = nodes[j];
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
158 double vx = n1.x - n2.x;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
159 double vy = n1.y - n2.y;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
160 double len = vx * vx + vy * vy;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
161 if (len == 0) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
162 dx += Math.random();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
163 dy += Math.random();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
164 } else if (len < 100*100) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
165 dx += vx / len;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
166 dy += vy / len;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
167 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
168 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
169 double dlen = dx * dx + dy * dy;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
170 if (dlen > 0) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
171 dlen = Math.sqrt(dlen) / 2;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
172 n1.dx += dx / dlen;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
173 n1.dy += dy / dlen;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
174 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
175 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
176
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
177 Dimension d = getSize();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
178 for (int i = 0 ; i < nnodes ; i++) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
179 Node n = nodes[i];
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
180 if (!n.fixed) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
181 n.x += Math.max(-5, Math.min(5, n.dx));
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
182 n.y += Math.max(-5, Math.min(5, n.dy));
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
183 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
184 if (n.x < 0) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
185 n.x = 0;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
186 } else if (n.x > d.width) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
187 n.x = d.width;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
188 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
189 if (n.y < 0) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
190 n.y = 0;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
191 } else if (n.y > d.height) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
192 n.y = d.height;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
193 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
194 n.dx /= 2;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
195 n.dy /= 2;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
196 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
197 repaint();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
198 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
199
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
200 Node pick;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
201 boolean pickfixed;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
202 Image offscreen;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
203 Dimension offscreensize;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
204 Graphics offgraphics;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
205
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
206 final Color fixedColor = Color.red;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
207 final Color selectColor = Color.pink;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
208 final Color edgeColor = Color.black;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
209 final Color nodeColor = new Color(250, 220, 100);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
210 final Color stressColor = Color.darkGray;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
211 final Color arcColor1 = Color.black;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
212 final Color arcColor2 = Color.pink;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
213 final Color arcColor3 = Color.red;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
214
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
215 public void paintNode(Graphics g, Node n, FontMetrics fm) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
216 int x = (int)n.x;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
217 int y = (int)n.y;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
218 g.setColor((n == pick) ? selectColor : (n.fixed ? fixedColor : nodeColor));
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
219 int w = fm.stringWidth(n.lbl) + 10;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
220 int h = fm.getHeight() + 4;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
221 g.fillRect(x - w/2, y - h / 2, w, h);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
222 g.setColor(Color.black);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
223 g.drawRect(x - w/2, y - h / 2, w-1, h-1);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
224 g.drawString(n.lbl, x - (w-10)/2, (y - (h-4)/2) + fm.getAscent());
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
225 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
226
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
227 public synchronized void update(Graphics g) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
228 Dimension d = getSize();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
229 if ((offscreen == null) || (d.width != offscreensize.width) || (d.height != offscreensize.height)) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
230 offscreen = createImage(d.width, d.height);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
231 offscreensize = d;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
232 if (offgraphics != null) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
233 offgraphics.dispose();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
234 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
235 offgraphics = offscreen.getGraphics();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
236 offgraphics.setFont(getFont());
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
237 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
238
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
239 offgraphics.setColor(getBackground());
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
240 offgraphics.fillRect(0, 0, d.width, d.height);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
241 for (int i = 0 ; i < nedges ; i++) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
242 Edge e = edges[i];
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
243 int x1 = (int)nodes[e.from].x;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
244 int y1 = (int)nodes[e.from].y;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
245 int x2 = (int)nodes[e.to].x;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
246 int y2 = (int)nodes[e.to].y;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
247 int len = (int)Math.abs(Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)) - e.len);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
248 offgraphics.setColor((len < 10) ? arcColor1 : (len < 20 ? arcColor2 : arcColor3)) ;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
249 offgraphics.drawLine(x1, y1, x2, y2);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
250 if (stress) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
251 String lbl = String.valueOf(len);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
252 offgraphics.setColor(stressColor);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
253 offgraphics.drawString(lbl, x1 + (x2-x1)/2, y1 + (y2-y1)/2);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
254 offgraphics.setColor(edgeColor);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
255 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
256 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
257
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
258 FontMetrics fm = offgraphics.getFontMetrics();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
259 for (int i = 0 ; i < nnodes ; i++) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
260 paintNode(offgraphics, nodes[i], fm);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
261 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
262 g.drawImage(offscreen, 0, 0, null);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
263 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
264
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
265 //1.1 event handling
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
266 public void mouseClicked(MouseEvent e) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
267 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
268
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
269 public void mousePressed(MouseEvent e) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
270 addMouseMotionListener(this);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
271 double bestdist = Double.MAX_VALUE;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
272 int x = e.getX();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
273 int y = e.getY();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
274 for (int i = 0 ; i < nnodes ; i++) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
275 Node n = nodes[i];
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
276 double dist = (n.x - x) * (n.x - x) + (n.y - y) * (n.y - y);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
277 if (dist < bestdist) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
278 pick = n;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
279 bestdist = dist;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
280 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
281 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
282 pickfixed = pick.fixed;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
283 pick.fixed = true;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
284 pick.x = x;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
285 pick.y = y;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
286 repaint();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
287 e.consume();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
288 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
289
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
290 public void mouseReleased(MouseEvent e) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
291 removeMouseMotionListener(this);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
292 if (pick != null) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
293 pick.x = e.getX();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
294 pick.y = e.getY();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
295 pick.fixed = pickfixed;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
296 pick = null;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
297 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
298 repaint();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
299 e.consume();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
300 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
301
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
302 public void mouseEntered(MouseEvent e) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
303 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
304
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
305 public void mouseExited(MouseEvent e) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
306 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
307
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
308 public void mouseDragged(MouseEvent e) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
309 pick.x = e.getX();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
310 pick.y = e.getY();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
311 repaint();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
312 e.consume();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
313 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
314
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
315 public void mouseMoved(MouseEvent e) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
316 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
317
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
318 public void start() {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
319 relaxer = new Thread(this);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
320 relaxer.start();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
321 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
322
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
323 public void stop() {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
324 relaxer = null;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
325 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
326
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
327 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
328
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
329
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
330 public class Graph extends Applet implements ActionListener, ItemListener {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
331
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
332 GraphPanel panel;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
333 Panel controlPanel;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
334
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
335 Button scramble = new Button("Scramble");
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
336 Button shake = new Button("Shake");
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
337 Checkbox stress = new Checkbox("Stress");
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
338 Checkbox random = new Checkbox("Random");
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
339
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
340 public void init() {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
341 setLayout(new BorderLayout());
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
342
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
343 panel = new GraphPanel(this);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
344 add("Center", panel);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
345 controlPanel = new Panel();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
346 add("South", controlPanel);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
347
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
348 controlPanel.add(scramble); scramble.addActionListener(this);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
349 controlPanel.add(shake); shake.addActionListener(this);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
350 controlPanel.add(stress); stress.addItemListener(this);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
351 controlPanel.add(random); random.addItemListener(this);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
352
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
353 String edges = getParameter("edges");
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
354 for (StringTokenizer t = new StringTokenizer(edges, ",") ; t.hasMoreTokens() ; ) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
355 String str = t.nextToken();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
356 int i = str.indexOf('-');
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
357 if (i > 0) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
358 int len = 50;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
359 int j = str.indexOf('/');
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
360 if (j > 0) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
361 len = Integer.valueOf(str.substring(j+1)).intValue();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
362 str = str.substring(0, j);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
363 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
364 panel.addEdge(str.substring(0,i), str.substring(i+1), len);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
365 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
366 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
367 Dimension d = getSize();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
368 String center = getParameter("center");
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
369 if (center != null){
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
370 Node n = panel.nodes[panel.findNode(center)];
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
371 n.x = d.width / 2;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
372 n.y = d.height / 2;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
373 n.fixed = true;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
374 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
375 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
376
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
377 public void destroy() {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
378 remove(panel);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
379 remove(controlPanel);
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
380 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
381
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
382 public void start() {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
383 panel.start();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
384 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
385
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
386 public void stop() {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
387 panel.stop();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
388 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
389
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
390 public void actionPerformed(ActionEvent e) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
391 Object src = e.getSource();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
392
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
393 if (src == scramble) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
394 play(getCodeBase(), "audio/computer.au");
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
395 Dimension d = getSize();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
396 for (int i = 0 ; i < panel.nnodes ; i++) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
397 Node n = panel.nodes[i];
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
398 if (!n.fixed) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
399 n.x = 10 + (d.width-20)*Math.random();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
400 n.y = 10 + (d.height-20)*Math.random();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
401 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
402 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
403 return;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
404 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
405
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
406 if (src == shake) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
407 play(getCodeBase(), "audio/gong.au");
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
408 Dimension d = getSize();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
409 for (int i = 0 ; i < panel.nnodes ; i++) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
410 Node n = panel.nodes[i];
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
411 if (!n.fixed) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
412 n.x += 80*Math.random() - 40;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
413 n.y += 80*Math.random() - 40;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
414 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
415 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
416 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
417
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
418 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
419
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
420 public void itemStateChanged(ItemEvent e) {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
421 Object src = e.getSource();
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
422 boolean on = e.getStateChange() == ItemEvent.SELECTED;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
423 if (src == stress) panel.stress = on;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
424 else if (src == random) panel.random = on;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
425 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
426
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
427 public String getAppletInfo() {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
428 return "Title: GraphLayout \nAuthor: <unknown>";
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
429 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
430
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
431 public String[][] getParameterInfo() {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
432 String[][] info = {
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
433 {"edges", "delimited string", "A comma-delimited list of all the edges. It takes the form of 'C-N1,C-N2,C-N3,C-NX,N1-N2/M12,N2-N3/M23,N3-NX/M3X,...' where C is the name of center node (see 'center' parameter) and NX is a node attached to the center node. For the edges connecting nodes to eachother (and not to the center node) you may (optionally) specify a length MXY separated from the edge name by a forward slash."},
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
434 {"center", "string", "The name of the center node."}
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
435 };
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
436 return info;
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
437 }
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
438
97ca5f5447cd *** empty log message ***
pin
parents:
diff changeset
439 }