import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.Graphics; import java.awt.Color; import java.awt.image.BufferedImage; import java.io.BufferedReader; import java.io.FileReader; public class Simulation { private static final double PADDING = 50.0; public static void main(String[] args) { Dimension dm = Toolkit.getDefaultToolkit().getScreenSize(); final int SCREEN_WIDTH = (int)dm.getWidth(); final int SCREEN_HEIGHT = (int)dm.getHeight(); JFrame f = new JFrame("Air Traffic Simulation"); Airport[] airports = readfile("files/map.data"); normalize(airports, f, (2 * SCREEN_WIDTH) / 3, (2 * SCREEN_HEIGHT) / 3); f.setLocation(SCREEN_WIDTH / 6, SCREEN_HEIGHT / 6); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setContentPane(new Content(f, airports)); f.setVisible(true); f.setResizable(false); } private static Airport[] readfile(String file) { try { BufferedReader read = new BufferedReader(new FileReader(file)); int size = Integer.parseInt(read.readLine()); Airport[] p = new Airport[size]; for(int k = 0; k < size; k++) { String[] airport = read.readLine().split(","); double latitude = Double.parseDouble(airport[2]); double longitude = Double.parseDouble(airport[3]); p[k] = new Airport(airport[0], airport[1], latitude, longitude); } return p; } catch(Exception e) { System.out.println("Error parsing map file."); System.exit(1); } return null; } private static void normalize(Airport[] a, JFrame f, int WIDTH, int HEIGHT) { double[] ext = getExtremes(a); double minLat, minLong, maxLat, maxLong; minLat = ext[0]; maxLat = ext[1]; double latRange = maxLat - minLat; minLong = ext[2]; maxLong = ext[3]; double longRange = maxLong - minLong; HEIGHT = (int)(latRange/longRange * WIDTH) + 100; f.setSize(WIDTH, HEIGHT); /* System.out.println("Lat range: " + latRange); System.out.println("Long range: " + longRange); System.out.println("Min Lat: " + minLat + "\tMax Lat: " + maxLat); System.out.println("Min Long: " + minLong + "\tMax Long: " + maxLong); */ for(int k = 0; k < a.length; k++) { double newLat = ((a[k].getLat() - minLat) / latRange * (HEIGHT - 2 * PADDING) + PADDING); double newLong = ((a[k].getLong() - minLong) / longRange * (WIDTH - 2 * PADDING) + PADDING); a[k].setLat(HEIGHT - newLat); a[k].setLong(newLong); } } private static double[] getExtremes(Airport[] a) { double minLat = a[0].getLat(); double maxLat = a[0].getLat(); double minLong = a[0].getLong(); double maxLong = a[0].getLong(); for(int k = 1; k < a.length; k++) { double thisLat = a[k].getLat(); double thisLong = a[k].getLong(); if(thisLat < minLat) minLat = thisLat; else if(thisLat > maxLat) maxLat = thisLat; if(thisLong < minLong) minLong = thisLong; else if(thisLong > maxLong) maxLong = thisLong; } return new double[] { minLat, maxLat, minLong, maxLong }; } private static class Content extends JPanel { private Renderer r; private BufferedImage image; private Graphics graphics; private int WIDTH, HEIGHT; public Content(JFrame f, Airport[] a) { Dimension d = f.getSize(); WIDTH = (int)d.getWidth(); HEIGHT = (int)d.getHeight(); r = new Renderer(); image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); graphics = image.getGraphics(); graphics.setColor(Color.black); graphics.fillRect(0, 0, WIDTH, HEIGHT); render(a); } public void paintComponent(Graphics g) { g.drawImage(image, 0, 0, getWidth(), getHeight(), null); } private void render(Airport[] a) { graphics.setColor(Color.white); for(int k = 0; k < a.length; k++) { int myLat, myLong; myLat = (int)a[k].getLat(); myLong = (int)a[k].getLong(); graphics.fillRect(myLong - 1, myLat - 1, 3, 3); } repaint(); } } }