This is the syntax highlighted version of Slider.java.
/*************************************************************************
* Compilation: javac Slider.java
* Execution: java Spirograph
* Dependencies: StdDraw.java
*
* Draw a curve formed by rolling a smaller circle of radius r inside
* a larger circle or radius R. If the pen offset of the pen point in
* the moving circle is a, then the equation of the resulting curve
* at time t is
*
* x = (R+r)*cos(t) - (r+a)*cos(((R+r)/r)*t)
* y = (R+r)*sin(t) - (r+a)*sin(((R+r)/r)*t)
*
* % java Spirograph 180 40 15
*
* % java Spirograph 100 55 20
*
* Credits: idea suggested by Diego Nehab
* Reference: http://www.wordsmith.org/~anu/java/spirograph.html
*
*
*************************************************************************/
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
import java.awt.Color;
public class Slider extends JFrame implements ChangeListener {
private int SIZE = 650;
private Draw d = new Draw(SIZE, SIZE);
private JSlider sliderR = new JSlider(JSlider.HORIZONTAL, 0, 250, 180);
private JSlider sliderS = new JSlider(JSlider.HORIZONTAL, 0, 100, 40);
private JSlider sliderA = new JSlider(JSlider.HORIZONTAL, 0, 90, 15);
// create the frame with an empty image
public Slider() {
// a panel for the 3 sliders
JPanel sliders = new JPanel();
sliders.add(sliderR);
sliders.add(sliderS);
sliders.add(sliderA);
sliderR.setBorder(new TitledBorder(new EtchedBorder()));
sliderS.setBorder(new TitledBorder(new EtchedBorder()));
sliderA.setBorder(new TitledBorder(new EtchedBorder()));
sliderR.addChangeListener(this);
sliderS.addChangeListener(this);
sliderA.addChangeListener(this);
// add components to the frame
Container c = getContentPane();
c.setLayout(new BorderLayout());
c.add(d.getJLabel(), BorderLayout.CENTER);
c.add(sliders, BorderLayout.NORTH);
setTitle("Slider 1.0");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
pack();
stateChanged(null); // draw default spirograph
setVisible(true);
}
public void stateChanged(ChangeEvent e) {
double R = sliderR.getValue();
double r = sliderS.getValue();
double a = sliderA.getValue();
TitledBorder border;
border = (TitledBorder) sliderR.getBorder();
border.setTitle("R = " + R);
border = (TitledBorder) sliderS.getBorder();
border.setTitle("r = " + r);
border = (TitledBorder) sliderA.getBorder();
border.setTitle("a = " + a);
d.clear(Color.black);
d.setColor(Color.yellow);
for (double t = 0.0; t < 80; t += 0.01) {
double x = SIZE/2 + (R+r) * Math.cos(t) - (r+a) * Math.cos(((R+r)/r)*t);
double y = SIZE/2 + (R+r) * Math.sin(t) - (r+a) * Math.sin(((R+r)/r)*t);
d.go(x, y);
d.rotate(-Math.toDegrees((R+r)/r)*t);
d.spot(1);
d.rotate(+Math.toDegrees((R+r)/r)*t);
}
repaint();
}
// create one frame object
public static void main(String[] args) {
new Slider();
}
}
Last updated: Fri May 28 17:44:53 EDT 2004
.
Copyright © 2004, Robert Sedgewick and Kevin Wayne.