package com.knutejohnson.aviation.gload; import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; public class BankAngle extends JPanel { public static final Font SMALL = new Font("SansSerif",Font.PLAIN,20); public static final Font LARGE = new Font("SansSerif",Font.PLAIN,32); private int bankAngle; public BankAngle() { setLayout(new GridBagLayout()); setBorder(BorderFactory.createLineBorder(Color.BLUE)); GridBagConstraints c = new GridBagConstraints(); c.gridx = 0; c.insets = new Insets(2,2,2,2); c.fill = GridBagConstraints.HORIZONTAL; AirplaneSymbol as = new AirplaneSymbol(); add(as,c); JLabel l = new JLabel("Bank Angle",JLabel.CENTER); add(l,c); final JSlider bank = new JSlider(0,89,0); bank.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent ce) { bankAngle = bank.getValue(); repaint(); } }); bank.setMajorTickSpacing(10); bank.setMinorTickSpacing(1); bank.setPaintLabels(true); bank.setPaintTicks(true); @SuppressWarnings("unchecked") Hashtable h = bank.createStandardLabels(10,0); h.put(89,new JLabel("89")); bank.setLabelTable(h); add(bank,c); } class AirplaneSymbol extends JPanel { public AirplaneSymbol() { setPreferredSize(new Dimension(400,300)); } public void paintComponent(Graphics g2d) { Graphics2D g = (Graphics2D)g2d; g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); int w = getWidth(); int h = getHeight(); int[] wx = { w/2-150,w/2,w/2+150,w/2+150,w/2,w/2-150 }; int[] wy = { h/2+1,h/2+5,h/2+1,h/2-1,h/2-5,h/2-1 }; Polygon wings = new Polygon(wx,wy,wx.length); int[] tx = { w/2-2,w/2,w/2+1,w/2+4 }; int[] ty = { h/2,h/2-70,h/2-70,h/2 }; Polygon tail = new Polygon(tx,ty,tx.length); // draw background g.setColor(Color.WHITE); g.fillRect(0,0,w,h); // calculate angle in radians double theta = bankAngle / 360.0 * 2.0 * Math.PI; // calculate g load double gload = 1.0 / Math.cos(theta); // calculate stall speed in percent double stall = Math.sqrt(gload) * 100.0; // draw g load and stall speed g.setColor(Color.BLACK); g.setFont(SMALL); g.drawString("Load Factor",5,20); g.drawString("Stall Speed",290,20); g.setFont(LARGE); g.drawString(String.format("%5.2fG",gload),5,50); g.drawString(String.format("%3.0f%%",stall),290,50); // rotate the airplane g.rotate(theta,w/2,h/2); // draw the airplane g.setColor(Color.BLUE); g.fillOval(w/2-20,h/2-20,40,40); g.fillPolygon(wings); g.fillPolygon(tail); } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { JFrame f = new JFrame("Bank Angle G-Load Calculator"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); BankAngle ba = new BankAngle(); f.add(ba,BorderLayout.CENTER); f.pack(); f.setVisible(true); } }); } }