tags:

views:

73

answers:

3

In order to represent a List of Objects with different colors in a GWT-Widget, we need to get dynamically a List of colors with as much different colors as objects. Since the size of the List can vary, we need to be able to compute such a List of colors.

+5  A: 

Something like this would do I guess. No randomness, just calculates which color steps to take and splits all color range to that steps. If you limit the lower limit - you will remove too dark colors, and limiting the upper limit will remove too bright colors.

List<int> getUniqueColors(int amount) {
    final int lowerLimit = 0x101010;
    final int upperLimit = 0xE0E0E0;
    final int colorStep = (upperLimit-lowerLimit)/amount;

    final List<int> colors = new ArrayList<int>(amount);
    for (int i=0;i<amount;i++) {
        int color = lowerLimit+colorStep*i;
        colors.add(color);
    }
    return colors;
}
Max
Please also see my another version of this solution at the bottom. It generates far better results than this one, but is a little bit more complex.
Max
+2  A: 
aioobe
+3  A: 

Another version of my solution with ranges:

List<int> getUniqueColors(int amount) {
    final int lowerLimit = 0x10;
    final int upperLimit = 0xE0;    
    final int colorStep = (upperLimit-lowerLimit)/Math.pow(amount,1f/3);

    final List<int> colors = new ArrayList<int>(amount);

    for (int R = lowerLimit;R < upperLimit; R+=colorStep)
        for (int G = lowerLimit;G < upperLimit; G+=colorStep)
            for (int B = lowerLimit;B < upperLimit; B+=colorStep) {
                if (colors.size() >= amount) { //The calculated step is not very precise, so this safeguard is appropriate
                    return colors;
                } else {
                    int color = (R<<16)+(G<<8)+(B);
                    colors.add(color);
                }               
            }
    return colors;
}

This one is more advance as it generates the colors that differ from each other as much as possible (something like @aiiobe did).

Generally we split the range to 3 subranges of red green and blue, calculate how many steps do we need to iterate each of them (by applying a pow(range,1f/3)) and iterate them.

Given the number 3 for example, it will generate 0x0000B1, 0x00B100, 0x00B1B1. For number 10 it will be: 0x000076, 0x0000EC, 0x007600, 0x007676, 0x0076EC, 0x00EC00, 0x00EC76, 0x00ECEC, 0x760000, 0x760076

Max
If you want to skip grey colors - some additional calculations would be required. You'd need some `if (r==g==b) then continue` in the loop and also you'd need to increase the `amount` by `Math.pow(amount,1f/3)` (to make skipping grey colors possible).
Max
or you could stick to varying the hue ;)
aioobe
Yup, but I'm not good with HSV so I proposed first thing that came up my mind.
Max