//Lissajous.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Lissajous extends JApplet implements ActionListener { private JLabel stepsLabel, aLabel, bLabel, cLabel, nLabel, infoLabel; private JTextField stepsField, aField, bField, cField, nField; private final int A=100, B=100, C=100, N=10, STEPS=1000; private int steps=STEPS; private double a=A, b=B, c=C, n=N; public void init() { Container container = getContentPane(); container.setLayout( new FlowLayout() ); infoLabel = new JLabel( "x(t)=a sin(nt+c), y(t)=b sin(t) " ); container.add( infoLabel ); aLabel = new JLabel( "a" ); aField = new JTextField( 4 ); aField.setText(""+A); container.add( aLabel ); container.add( aField ); bLabel = new JLabel( "b" ); bField = new JTextField( 4 ); bField.setText(""+B); container.add( bLabel ); container.add( bField ); cLabel = new JLabel( "c" ); cField = new JTextField( 4 ); cField.setText(""+C); container.add( cLabel ); container.add( cField ); nLabel = new JLabel( "n" ); nField = new JTextField( 4 ); nField.setText(""+N); container.add( nLabel ); container.add( nField ); stepsLabel = new JLabel( "Steps" ); stepsField = new JTextField( 4 ); stepsField.setText(""+STEPS); container.add( stepsLabel ); container.add( stepsField ); aField.addActionListener( this ); bField.addActionListener( this ); cField.addActionListener( this ); nField.addActionListener( this ); stepsField.addActionListener( this ); } public void actionPerformed( ActionEvent event ) { if ( event.getSource() == aField ) a = Double.parseDouble( event.getActionCommand()); else if ( event.getSource() == bField ) b = Double.parseDouble( event.getActionCommand()); else if ( event.getSource() == cField ) c = Double.parseDouble( event.getActionCommand()); else if ( event.getSource() == nField ) n = Double.parseDouble( event.getActionCommand()); else if ( event.getSource() == stepsField ) steps = Integer.parseInt( event.getActionCommand()); //whichever textfield changed, re-paint repaint(); } public void paint( Graphics g ) { super.paint( g ); int x1=0, y1=0, x2, y2; //initialize to avoid syntax error g.setColor(new Color(80,80,80)); g.drawLine(getWidth()/2,0,getWidth()/2,getHeight()); g.drawLine(0,getHeight()/2,getWidth(),getHeight()/2); g.setColor(new Color(255,0,0)); for (int t=1; t<=steps; t++) { //circle: // x1 = x2 = (int)(Math.cos(t) * a) + getWidth()/2; //y1 = y2 = (int)(Math.sin(t) * a) + getHeight()/2; //Lissajous: x2 = (int)(Math.sin(n*t+c) * a) + getWidth()/2; y2 = (int)(Math.sin(t) * b) + getHeight()/2; if (t > 1) //skip first g.drawLine(x1,y1,x2,y2); x1 = x2; y1 = y2; } } }