/* Michael Scott, November 2001 */ import java.io.*; import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import javax.swing.*; class point { public int x; public int y; point(int X, int Y) { x = X; y = Y; } } class edge { public int a; public int b; edge(int A, int B) { a = A; b = B; } } public class DisplayGraph extends JApplet { private final int width = 500; private final int height = 500; private final int border = 10; private final int dotsize = 6; private point points[]; private edge edges[]; private int n = 0; // number of points private int m = 0; // number of edges private int minx = Integer.MAX_VALUE; private int miny = Integer.MAX_VALUE; private int maxx = 0; private int maxy = 0; private void die(String s) { System.err.println(s); System.exit(1); } public void init() { setBackground(Color.white); setForeground(Color.black); StreamTokenizer in = new StreamTokenizer( new BufferedReader(new InputStreamReader(System.in))); try { // read number of points, edges if (in.nextToken() != in.TT_NUMBER) die("Missing number of points"); n = (int) in.nval; if (in.nextToken() != in.TT_NUMBER) die("Missing number of edges"); m = (int) in.nval; points = new point[n]; edges = new edge[m]; // read points themselves for (int i = 0; i < n; i++) { if (in.nextToken() != in.TT_NUMBER) die("Missing X value #" + String.valueOf(i)); final int X = (int) in.nval; if (in.nextToken() != in.TT_NUMBER) die("Missing Y value #" + String.valueOf(i)); final int Y = (int) in.nval; points[i] = new point(X, Y); if (X < minx) minx = X; if (Y < miny) miny = Y; if (X > maxx) maxx = X; if (Y > maxy) maxy = Y; } // read edges for (int i = 0; i < m; i++) { if (in.nextToken() != in.TT_NUMBER) die("Missing edge tail #" + String.valueOf(i)); final int A = (int) in.nval; if (A >= n) die("Edge tail #" + String.valueOf(i) + " out of bounds"); if (in.nextToken() != in.TT_NUMBER) die("Missing edge head #" + String.valueOf(i)); final int B = (int) in.nval; if (B >= n) die("Edge head #" + String.valueOf(i) + " out of bounds"); edges[i] = new edge(A, B); } } catch (IOException e) { die(e.toString()); } } private int xCoord(int x) { return (x-minx)*width/(maxx-minx)+border; } private int yCoord(int y) { return (y-miny)*height/(maxy-miny)+border; } private void putPoint(Graphics2D g, point p) { g.setPaint(Color.blue); g.fillOval(xCoord(p.x)-dotsize/2, yCoord(p.y)-dotsize/2, dotsize, dotsize); } private void putEdge(Graphics2D g, edge e) { g.setPaint(Color.black); g.draw(new Line2D.Double( xCoord(points[e.a].x), yCoord(points[e.a].y), xCoord(points[e.b].x), yCoord(points[e.b].y))); } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; for (int i = 0; i < n; i++) { putPoint(g2, points[i]); } for (int i = 0; i < m; i++) { putEdge(g2, edges[i]); } } public static void main(String args[]) { final DisplayGraph me = new DisplayGraph(); me.init(); JFrame f = new JFrame("Displaying Graph"); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); f.getContentPane().add("Center", me); f.pack(); f.setSize(new Dimension(530, 550)); f.show(); f.repaint(); } }