package PS5; import java.awt.*; // import Java AWT import java.util.*; // import utility classes (for Vector class) import javax.swing.*; import java.awt.geom.*; // 2-D graphics public class BusDrawing extends JPanel { private Vector drawList; // Vector of lines to draw private BusSystem bSystem; public BusDrawing(BusSystem b) { drawList = new Vector(); bSystem = b; } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; // Get outputs from bus system object double h = bSystem.getHeadway(); double f = bSystem.getFare(); double n = bSystem.getNoRtes(); double riders = bSystem.getRiders(); double revenue = bSystem.getRevenue(); double cost = bSystem.getCost(); // Display text outputs if there are results if (drawList.size() > 0) { g2.drawString("Headway: " + h, 10, 10); g2.drawString("No rtes: " + n, 10, 30); g2.drawString("Fare : " + f, 10, 50); g2.drawString("Riders : " + riders, 10, 70); g2.drawString("Revenue: " + revenue, 10, 90); g2.drawString("Cost : " + cost, 10, 110); // Labels for Logan airport, etc. g2.drawString("Logan Airport", 260, 260); } //g2.setStroke(new BasicStroke(2.0F)); // Set line width for (int i = 0; i < drawList.size(); i++) { if (i == 0) { // Assume outer sectors always drawn first (restrictive, but ok for homework) g2.setPaint(Color.black); g2.draw((Arc2D) drawList.elementAt(i)); } else if (i == 1) { // Assume inner sector drawn next g2.setPaint(Color.magenta); g2.draw((Arc2D) drawList.elementAt(i)); } else { // All other elements are lines (bus routes) g2.setPaint(Color.red); g2.draw((Line2D) drawList.elementAt(i)); } } } public void busLines() { double x0 = 100.0; // Start 100 pixels from left edge (leave room for labels) double y0 = x0; // Start same number of pixels from top edge // double box = BusFrame.Y-200; // Size of circle sector (300 in this homework) double box = 300.0; // Size of circle sector (300 in this homework) double center = x0 + 0.5*box; // Center of circle sector drawList.clear(); // Start with new Vector each time double rs = bSystem.getRteSpacing(); // Start outer arc at 64 degrees, sweep 232 degrees. Set L2=40 miles= 150 pixels arbitrarily drawList.addElement(new Arc2D.Double(x0, y0, box, box, 64.0, 232.0, Arc2D.PIE)); // Use fixed arc to draw inner bound, similar to outer bound. L1=20 miles= 75 pixels, or half of L2 drawList.addElement(new Arc2D.Double(x0+0.25*box, y0+0.25*box, 0.5*box, 0.5*box, 64.0, 232.0, Arc2D.OPEN)); // Draw routes starting at rte spacing + 64 degrees, converted to radians double angle = 64.0*Math.PI/180.0 + rs; double length = 0.3125*box; // Rte length= L1+5= 25 miles, or 5/8 of L2 while (angle < 296.0*Math.PI/180.0) { // 64+232 sweep double dy = length*Math.sin(angle); // sin, cos use radians double dx = length*Math.cos(angle); drawList.addElement(new Line2D.Double(center, center, center + dx, center - dy)); angle += rs; } } }