Sniplet of RandomColor.java
//@author tjacobs
import java.awt.Color;
import java.util.ArrayList;
import java.util.Random;
public class RandomColor {
public static final int CONTINUOUS = 0;
public static final int RED = 0;
public static final int GREEN = 1;
public static final int BLUE = 2;
private static final Color[] ROYGBV = new Color[] {Color.RED, Color.ORANGE, Color.YELLOW, Color.GREEN, Color.BLUE, Color.MAGENTA};
private int mSpots[] = new int [] {5, 5, 5};
private float mRStart = 0, mGStart = 0, mBStart = 0,
mRRange = 1, mGRange = 1, mBRange = 1;
private ArrayList mBlockedColors;
private Random mRandom = new Random(System.currentTimeMillis());
public RandomColor() {}
public RandomColor( float r_start, float r_end,
float g_start, float g_end,
float b_start, float b_end) {
setRedRange(r_start, r_end);
setGreenRange(g_start, g_end);
setBlueRange(b_start, b_end);
}
public void setRedRange(float start, float end) {
mRStart = Math.min(start, end);
mRRange = Math.abs(end - start);
}
public void setGreenRange(float start, float end) {
mGStart = Math.min(start, end);
mGRange = Math.abs(end - start);
}
public void setBlueRange(float start, float end) {
mBStart = Math.min(start, end);
mBRange = Math.abs(end - start);
}
public void setSpots(int RG_or_B, int spots) {
switch (RG_or_B) {
case RED : mSpots[RED] = spots; break;
case GREEN : mSpots[GREEN] = spots; break;
case BLUE : mSpots[BLUE] = spots; break;
default : throw new RuntimeException("Illegal RG_or_B argument");
}
}
public Color generateRandomColor() {
Color c = null;
if (mBlockedColors == null) mBlockedColors = new ArrayList(1);
do {
float r = generateRandomFloat(mRStart, mRRange, mSpots[RED]);
float g = generateRandomFloat(mGStart, mGRange, mSpots[GREEN]);
float b = generateRandomFloat(mBStart, mBRange, mSpots[BLUE]);
c = new Color(r, g, b);
} while (mBlockedColors.contains(c));
return c;
}
private float generateRandomFloat(float start, float range, int spots) {
if (spots == 1) return start + range;
if (spots != CONTINUOUS) {
int n = mRandom.nextInt(spots);
return start + (range * (n / (float)(spots - 1)));
}
//continuous
return start + mRandom.nextFloat() * range;
}
public void addColorBlocked(Color c) {
if (mBlockedColors == null) {
mBlockedColors = new ArrayList();
}
mBlockedColors.add(c);
}
public void removeColorBlocked(Color c) {
mBlockedColors.remove(c);
}
public void setBlackBlocked(boolean b) {
if (b) addColorBlocked(Color.BLACK);
else removeColorBlocked(Color.BLACK);
}
public void setWhiteBlocked(boolean b) {
if (b) addColorBlocked(Color.WHITE);
else removeColorBlocked(Color.WHITE);
}
public Color getRandomROYGBV() {
return ROYGBV[mRandom.nextInt(ROYGBV.length)];
}
}