college/ss2010/gdi2/java/libs/acm/demo/YarnPattern.java
2013-12-19 19:05:28 +01:00

68 lines
2.0 KiB
Java

/*
* File: YarnPattern.java
* ----------------------
* This program illustrates the use of the GLine class to simulate
* winding a piece of colored yarn around a set of pegs equally
* spaced along the edges of the canvas. At each step, the yarn is
* stretched from its current peg to the one DELTA pegs further on.
*/
import acm.graphics.*;
import acm.program.*;
import java.awt.*;
import java.util.*;
public class YarnPattern extends GraphicsProgram {
/** Runs the program */
public void run() {
ArrayList pegs = createPegList();
int thisPeg = 0;
int nextPeg = -1;
while (thisPeg != 0 || nextPeg == -1) {
nextPeg = (thisPeg + DELTA) % pegs.size();
GPoint p0 = (GPoint) pegs.get(thisPeg);
GPoint p1 = (GPoint) pegs.get(nextPeg);
GLine line = new GLine(p0.getX(), p0.getY(),
p1.getX(), p1.getY());
line.setColor(Color.MAGENTA);
add(line);
thisPeg = nextPeg;
}
}
/* Create an array list containing the locations of the pegs */
private ArrayList createPegList() {
ArrayList pegs = new ArrayList();
for (int i = 0; i < N_ACROSS; i++) {
pegs.add(new GPoint(i * PEG_SEP, 0));
}
for (int i = 0; i < N_DOWN; i++) {
pegs.add(new GPoint(N_ACROSS * PEG_SEP, i * PEG_SEP));
}
for (int i = N_ACROSS; i > 0; i--) {
pegs.add(new GPoint(i * PEG_SEP, N_DOWN * PEG_SEP));
}
for (int i = N_DOWN; i > 0; i--) {
pegs.add(new GPoint(0, i * PEG_SEP));
}
return pegs;
}
/* Private constants */
private static final int N_ACROSS = 50;
private static final int N_DOWN = 30;
private static final int PEG_SEP = 10;
private static final int DELTA = 67;
/* Make sure that the application has the right dimensions */
public static final int APPLICATION_WIDTH = N_ACROSS * PEG_SEP;
public static final int APPLICATION_HEIGHT = N_DOWN * PEG_SEP;
/* Standard Java entry point */
/* This method can be eliminated in most Java environments */
public static void main(String[] args) {
new YarnPattern().start(args);
}
}