6
votes

Comment calculer dynamiquement une liste de couleurs?

Afin de représenter une liste d'objets avec différentes couleurs dans un widget GWT, nous devons être dynamiquement une liste de couleurs avec des couleurs aussi différentes que des objets. Étant donné que la taille de la liste peut varier, nous devons être capables de calculer une telle liste de couleurs.


0 commentaires

3 Réponses :


6
votes

Quelque chose comme ça serait que je devine. Aucune aléatoire, il suffit de calcule quelles étapes de couleur pour prendre et scinder toute la plage de couleurs à cette marche. Si vous limitez la limite inférieure - vous supprimerez des couleurs trop sombres et la limitation de la limite supérieure éliminera les couleurs trop brillantes.

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

    final List<Integer> colors = new ArrayList<Integer>(amount);
    for (int i=0;i<amount;i++) {
        int color = lowerLimit+colorStep*i;
        colors.add(color);
    }
    return colors;
}


2 commentaires

S'il vous plaît voir également ma version une autre version de cette solution en bas. Il génère des résultats de bien meilleure que celle-ci, mais est un peu plus complexe.


Cela ne compile même pas. Vous ne pouvez pas avoir une liste de int en java. Vous voulez probablement changer cela en integer .



5
votes

Si je comprends votre situation correcte, vous êtes après plusieurs couleurs qui ont une sorte de "aussi différente que possible"? Je dirais, dans ce cas, vous suggérez que vous modifiez la valeur de la teinte (deux couleurs rouges avec une luminosité légèrement différente ne semblera pas très différente), alors vous obtenez quelque chose comme une "palette arc-en-ciel":

Ceci peut être obtenu avec ce qui suit CODE: P>

import java.awt.*;

public class TestComponent extends JPanel {

    int numCols = 6;

    public void paint(Graphics g) {

        float h = 0, dh = (float) getHeight() / numCols;
        Color[] cols = getDifferentColors(numCols);

        for (int i = 0; i < numCols; i++) {
            g.setColor(cols[i]);
            g.fillRect(0, (int) h, getWidth(), (int) (h += dh));
        }
    }

    public static Color[] getDifferentColors(int n) {
        Color[] cols = new Color[n];
        for (int i = 0; i < n; i++)
            cols[i] = Color.getHSBColor((float) i / n, 1, 1);
        return cols;
    }

    public static void main(String s[]) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new TestComponent());
        f.setSize(200, 200);
        f.setVisible(true);
    }
}


0 commentaires

7
votes

Une autre version de ma solution avec des gammes: xxx

Celui-ci est plus avancé car il génère les couleurs différentes les unes des autres autant que possible (quelque chose comme @Aiiobe a fait).

Généralement, nous divisons la gamme sur 3 subventions de rouge vert et bleue, calculez combien d'étapes avons-nous besoin de se déplacer chacune d'elles (en appliquant une pow (gamme, 1f / 3)) et les itérairez-les.

donné le numéro 3 par exemple, il générera 0x0000b1, 0x00b100, 0x00b1b1 . Pour le numéro 10, il sera: 0x000076, 0x0000ec, 0x007600, 0x007676, 0x0076ec, 0x00ec00, 0x00ec76, 0x00ecec, 0x760000, 0x760076


3 commentaires

Si vous voulez sauter des couleurs grises - certains calculs supplémentaires seraient nécessaires. Vous auriez besoin de si (r == g == b) puis continuez dans la boucle et que vous auriez également besoin d'augmenter le montant par math. POW (quantité, 1f / 3) (pour faire sauter des couleurs grises possibles).


ou vous pourriez rester à la variation de la teinte;)


Yup, mais je ne suis pas bon avec le HSV, j'ai donc proposé une première chose qui a monté la tête.