javarandomcolorsrgb

how could i compare colors in java?


im trying to make a random color generator but i dont want similar colors to show up in the arrayList

public class RandomColorGen {

public static Color RandColor() {
    Random rand = new Random();
    float r = rand.nextFloat();
    float g = rand.nextFloat();
    float b = rand.nextFloat();
    Color c = new Color(r, g, b, 1);
    return c;

}

public static ArrayList<Color> ColorList(int numOfColors) {
    ArrayList<Color> colorList = new ArrayList<Color>();
    for (int i = 0; i < numOfColors; i++) {
        Color c = RandColor();
        if(similarcolors){
            dont add
        }
        colorList.add(c);

    }
    return colorList;
}

}

I'm really confused please help :)


Solution

  • Implement a similarTo() method in Color class.

    Then use:

    public static ArrayList<Color> ColorList(int numOfColors) {
        ArrayList<Color> colorList = new ArrayList<Color>();
        for (int i = 0; i < numOfColors; i++) {
            Color c = RandColor();
            boolean similarFound = false;
            for(Color color : colorList){
                if(color.similarTo(c)){
                     similarFound = true;
                     break;
                }
            }
            if(!similarFound){
                colorList.add(c);
            } 
    
        }
        return colorList;
    }
    

    To implement the similarTo:

    Take a look at Color similarity/distance in RGBA color space and finding similar colors programatically. A simple approach can be:

    ((r2 - r1)2 + (g2 - g1)2 + (b2 - b1)2)1/2

    And:

    boolean similarTo(Color c){
        double distance = (c.r - this.r)*(c.r - this.r) + (c.g - this.g)*(c.g - this.g) + (c.b - this.b)*(c.b - this.b)
        if(distance > X){
            return true;
        }else{
            return false;
        }
    }
    

    However, you should find your X according to your imagination of similar.