The Persian Rug Program

Chapter: Abstraction
...Section: Interfaces
... ...Subsection: The Persian Rug Program

We have provided most of the code for implementing the persian rug algorithm. In fact, we have implemented everything except the specifics for a particular rug: 1) the number and choice of colors to be used; 2) the border color; and 3) the function newColor that computes a new color from the four corner colors. The program uses an interface to supply these specifics:

package persianRug;
import java.awt.*;

public interface RugSpecs {
  int colorListLength();
  int getBorderColor();
  Color getColor(int i);
  int newColor(int a, int b, int c, int d);
}
To create a RugDemo, you need only interact with the PersianRugMaker class. The RugDemo class could simply provide the usual main method as follows:

public class RugDemo {
  static public void main(String arg[]) {
    RugSpecs myrug = new MyRugSpecs();
    PersianRugMaker prm	= new PersianRugMaker(8, myrug);
    prm.makeRug();
  }
}
Here 8 is the value of n that determines the size of the rug (in this case, 257 x 257 pixels). MyRugSpecs is a class you write to implement the RugSpecs interface.

MyRugSpecs.java:

import java.awt.*:

public class MyRugSpecs implements RugSpecs {
  public int colorListLength() { ... }

  public int getBorderColor() { ... }

  Color getColor(int i) { ... }

  int newColor(int a, int b, int c, int d) { ... }
}
The complicated entries are getColor and newColor. getBorderColor is a choice of border color from the color list you will supply with getColor. colorListLength() should simply return the total number of colors you are using. getColor(i) should return the color associated with number i. For example, suppose you decide to use 5 colors: blue, green, orange, red, and yellow. You could implement getColor so that In this case, colorListLength() must return 5. If you want a red border, have getBorderColor() return 3.

Finally, to implement newColor, compute an integer based on the four integers passed in, all representing colors from the color list. The value you return will be used (mod the length of the color list) to determine the new color. For example, suppose you simply implement newColor as

int newColor(int a, int b, int c, int d) {
  return a+b+c+d;
}
Then, if the four corners of a square are 0 (blue), 4 (yellow), 3 (red) and 1 (green), the new color will be 0 + 4 + 3 + 1 = 8 mod 5 = 3 (red).

Symmetry. The best persian rugs are those that exhibit the most symmetrical patterns. The nature of the pattern produced by a particular implementation of RugSpecs is controlled entirely by the newColor function.

Q. 11
How does newColor control symmetry?



Exercise 14

Create an Exercise14 folder and copy PersianRugMaker.java, RugCanvas.java, RugFrame.java, and RugSpecs.java into it. Create RugDemo1 and RugDemo2 using 2 different RugSpecs implementations MyRugSpecs1 and MyRugSpecs2. Use 5 colors in MyRugSpecs1, and 10 colors in MyRugSpecs2, and different implementations for newColor. Experiment until you get the most satisfying symmetric persian rugs.



To see an example, go to this site.