import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;
/** (C) 2000 Charles Consulting, LLC
Class to draw radial line art image. Parameters allow the radius increment,
angle increment, and number of steps to be varied. May be run as Applet
or application */
public class Spinner extends StandAloneApplet {
private double angle;
private int radius;
private int angleStep = 90;
private int radiusStep = 0;
private int nStep = 100;
private int originX;
private int originY;
private RepaintListener repaintListener = new RepaintListener( );
private IntegerPanel anglePanel = new IntegerPanel("Angle increment",angleStep,1,360);
private IntegerPanel radiusPanel = new IntegerPanel("Radius step",radiusStep,0,100);
private IntegerPanel stepPanel = new IntegerPanel("Number steps",nStep,1,1000);
private Panel controlPanel = new Panel( );
Canvas canvas = new Canvas() {
public void paint(Graphics g)
{
Dimension size = getSize( );
final int height = size.height;
final int width = size.width;
radius = Math.min(height, width)/2;
originX = width/2;
originY = height/2;
angle = 0;
Point from = new Point( );
Point to = new Point(0,0);
double dAngle = angle;
int r = radius;
setPoint(from,radius,dAngle);
for (int i=0;i=20)
drawLine(g,from,to);
from.setLocation(to);
r -= radiusStep;
while (r <= 0)
r += radius;
}
}
};
/** called to initialize Applet */
public void init( )
{
setLayout(new BorderLayout( ));
add(canvas,BorderLayout.CENTER);
anglePanel.addActionListener(repaintListener);
radiusPanel.addActionListener(repaintListener);
stepPanel.addActionListener(repaintListener);
controlPanel.setLayout(new GridLayout(4,1));
controlPanel.add(anglePanel);
controlPanel.add(radiusPanel);
controlPanel.add(stepPanel);
add(controlPanel,BorderLayout.SOUTH);
setForeground(Color.red);
}
/** set specified point based on polar coordinates */
private final void setPoint(Point p,double r,double a)
{
final double sinVal = angleSine(a);
final double cosVal = angleCosine(a);
double x = r * sinVal;
double y = r * cosVal;
p.setLocation((int)x,(int)y);
}
/* return the sine of an angle in degrees */
private final double angleSine(double a)
{
return Math.sin(a * Math.PI/180);
}
/* return the cosine of an angle in degrees */
private final double angleCosine(double a)
{
return Math.cos(a * Math.PI/180);
}
/** draw a line betweent two points */
private final void drawLine(Graphics g,Point from, Point to)
{
int x1 = (int)from.x + originX;
int y1 = (int)from.y + originY;
int x2 = (int)to.x + originX;
int y2 = (int)to.y + originY;
g.drawLine(x1,y1,x2,y2);
}
private class RepaintListener implements ActionListener {
/** common listener object */
public void actionPerformed(ActionEvent e)
{
angleStep = anglePanel.getValue( );
radiusStep = radiusPanel.getValue( );
nStep = stepPanel.getValue( );
canvas.repaint( );
}
}
/** implement super abstract method */
public String getTitle( )
{
return "Spinner";
}
/** main used for application mode */
public static void main(String args[])
{
Spinner spinner = new Spinner( );
spinner.setupApplet(args);
}
}