Spiro
/*
Spirograph Applet
File: Spiro.java
Author: Anu Garg <http://www.wordsmith.org/~anu/anu.html>
Email: anu@wordsmith.org
A Spirograph is a curve defined by the equations:
x = (R+r)*cos(t) - (r+O)*cos(((R+r)/r)*t)
y = (R+r)*sin(t) - (r+O)*sin(((R+r)/r)*t)
Where R and r are the radii of fixed and moving circle,
and O is the offset in the moving circle.
*/
import java.awt.*;
import java.applet.*;
import java.lang.*;
//===========================Class: spiro=========================
public class Spiro extends Applet{
private int R = 50, r = 10, O = 5; // Radii
private int I = 400; // Number of Iterations
// Scrollbars for radii and I
Scrollbar sliderR, sliderr, sliderO, sliderI;
String sliderTextR = "Fixed circle radius (1-100): ";
String sliderTextr = "Moving circle radius (1-100): ";
String sliderTextO = "Moving circle offset (1-100): ";
String sliderTextI = "Iterations (100-400): ";
Label sliderLabelR, sliderLabelr, sliderLabelO, labelEmpty, sliderLabelI;
// sliderLabelR = sliderTextR + string(R)
Panel fields;
// Scrollbars for colors
Scrollbar redSlider,blueSlider,greenSlider;
Label redLabel, greenLabel, blueLabel;
private int redBits = 90, greenBits = 246, blueBits = 255;
String sliderTextRed = "Red (0-255): ";
String sliderTextGreen = "Green (0-255): ";
String sliderTextBlue = "Blue (0-255): ";
Panel colorPanel;
Font font;
Panel controlPanel;
String audioScroll = "drip.au";
String audioButton = "clink.au";
// Get parameters (for radii, color, #iterations)
public void getParams()
{
if(getParameter("R") != null)
{
R = new Integer(new String(getParameter("R"))).intValue();
if(R < 1)
R = 1;
else if(R > 100)
R = 100;
}
if(getParameter("smallr") != null)
{
r = new Integer(new String(getParameter("smallr"))).intValue();
if(r < 1)
r = 1;
else if(r > 100)
r = 100;
}
if(getParameter("O") != null)
{
O = new Integer(new String(getParameter("O"))).intValue();
if(O < 1)
O = 1;
else if(O > 100)
O = 100;
}
if(getParameter("redBits") != null)
{
redBits = new Integer(new String(getParameter("redBits"))).intValue();
if(redBits < 0)
redBits = 0;
else if(redBits > 255)
redBits = 255;
}
if(getParameter("greenBits") != null)
{
greenBits = new Integer(new String(getParameter("greenBits"))).intValue();
if(greenBits < 0)
greenBits = 0;
else if(greenBits > 255)
greenBits = 255;
}
if(getParameter("blueBits") != null)
{
blueBits = new Integer(new String(getParameter("blueBits"))).intValue();
if(blueBits < 0)
blueBits = 0;
else if(blueBits > 255)
blueBits = 255;
}
if(getParameter("I") != null)
{
I = new Integer(new String(getParameter("I"))).intValue();
if(I < 100)
I = 100;
else if(I > 400)
I = 400;
}
}
public void init()
{
getParams();
//setBackground(Color.gray);
setForeground(Color.white);
font = new Font("Helvetica", Font.BOLD, 12);
setLayout(new BorderLayout());
controlPanel = new Panel();
controlPanel.setLayout(new GridLayout(15,1));
add("East", controlPanel);
sliderLabelR = new Label(sliderTextR + Integer.toString(R));
controlPanel.add(sliderLabelR);
sliderR = new Scrollbar(Scrollbar.HORIZONTAL, R, 1, 1, 100);
controlPanel.add(sliderR);
sliderLabelr = new Label(sliderTextr + Integer.toString(r));
controlPanel.add(sliderLabelr);
sliderr = new Scrollbar(Scrollbar.HORIZONTAL, r, 1, 1, 100);
controlPanel.add(sliderr);
sliderLabelO = new Label(sliderTextO + Integer.toString(O));
controlPanel.add(sliderLabelO);
sliderO = new Scrollbar(Scrollbar.HORIZONTAL, O, 1, 0, 100);
controlPanel.add(sliderO);
redLabel = new Label(sliderTextRed + Integer.toString(redBits));
controlPanel.add(redLabel);
redSlider = new Scrollbar(Scrollbar.HORIZONTAL, redBits, 1, 0, 255);
controlPanel.add(redSlider);
greenLabel = new Label(sliderTextGreen + Integer.toString(greenBits));
controlPanel.add(greenLabel);
greenSlider = new Scrollbar(Scrollbar.HORIZONTAL, greenBits, 1, 0, 255);
controlPanel.add(greenSlider);
blueLabel = new Label(sliderTextBlue + Integer.toString(blueBits));
controlPanel.add(blueLabel);
blueSlider = new Scrollbar(Scrollbar.HORIZONTAL, blueBits, 1, 0, 255);
controlPanel.add(blueSlider);
sliderLabelI = new Label(sliderTextI + Integer.toString(I));
controlPanel.add(sliderLabelI);
sliderI = new Scrollbar(Scrollbar.HORIZONTAL, I, 1, 100, 400);
controlPanel.add(sliderI);
controlPanel.add(new Button("Random"));
}
public boolean handleEvent(Event e)
{
if (e.target instanceof Scrollbar) {
int value = ((Scrollbar)e.target).getValue();
if (e.target == sliderR) {
sliderLabelR.setText(sliderTextR + Integer.toString(value));
R = value;
} else if (e.target == sliderr) {
sliderLabelr.setText(sliderTextr + Integer.toString(value));
r = value;
} else if (e.target == sliderO) {
sliderLabelO.setText(sliderTextO + Integer.toString(value));
O = value;
} else if (e.target == redSlider) {
redLabel.setText(sliderTextRed + Integer.toString(value));
redBits=value;
} else if (e.target == greenSlider) {
greenLabel.setText(sliderTextGreen + Integer.toString(value));
greenBits=value;
} else if (e.target == blueSlider) {
blueLabel.setText(sliderTextBlue + Integer.toString(value));
blueBits=value;
} else if (e.target == sliderI) {
sliderLabelI.setText(sliderTextI + Integer.toString(value));
I = value;
}
repaint();
play(getDocumentBase(), audioScroll);
return true;
}
return super.handleEvent(e);
}
public boolean action(Event e, Object arg)
{
if("Random".equals(arg)){
R = (int)(Math.random()*100+1);
r = (int)(Math.random()*100+1);
O = (int)(Math.random()*r);
sliderLabelR.setText(sliderTextR + Integer.toString(R));
sliderLabelr.setText(sliderTextr + Integer.toString(r));
sliderLabelO.setText(sliderTextO + Integer.toString(O));
sliderR.setValue(R);
sliderr.setValue(r);
sliderO.setValue(O);
redBits = (int)(Math.random()*255);
blueBits = (int)(Math.random()*255);
greenBits = (int)(Math.random()*255);
redLabel.setText(sliderTextRed + Integer.toString(redBits));
greenLabel.setText(sliderTextGreen + Integer.toString(greenBits));
blueLabel.setText(sliderTextBlue + Integer.toString(blueBits));
redSlider.setValue(redBits);
greenSlider.setValue(greenBits);
blueSlider.setValue(blueBits);
play(getCodeBase(), audioButton);
repaint();
return true;
}
return true;
}
public void paint(Graphics g)
{
int x = 0;
int y = 0;
int prevx = 0;
int prevy = 0;
int t;
int x1, y1, x2, y2;
g.setFont(font);
g.clipRect(0,0,300,300);
g.setColor(new Color(redBits, greenBits, blueBits));
for(t=0; t<=I; t++){
prevx = x;
prevy = y;
x = (int)((R+r)*Math.cos((double)t) - (r+O)*Math.cos((double)(((R+r)/r)*t)));
y = (int)((R+r)*Math.sin((double)t) - (r+O)*Math.sin((double)(((R+r)/r)*t)));
if (t > 0){
//g.drawLine(x+150, y+150, x+150, y+150);
g.drawLine(prevx+150, prevy+150, x+150, y+150);
}
}
}
}
Back to Spiro applet page
New on the Java Boutique:
New Review:
Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling
API boasts simplicity, ease-of-integration, a well-rounded feature
set, and it's free!
New Applet:
Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA
sequences into three useful formats.
Elsewhere on internet.com:
WebDeveloper Java
Lots of Java information on webdeveloper.com
WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.
ScriptSearch Java
Hundreds of free Java code files to download.
jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.
|