INTRODUCTION TO COMPUTER SCIENCE
Robert Sedgewick and Kevin Wayne


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.