1. ホーム

[解決済み】N個の「はっきりした」色を自動的に生成するには?

2022-04-06 02:51:45

質問

N個の異なる色を自動的に選択するために、以下の2つのメソッドを書きました。これは、RGBキューブに対して区分線形関数を定義することで動作します。この方法の利点は、必要であれば漸進的なスケールも得られることですが、Nが大きくなると色が似通ってくる可能性があります。また、RGBキューブを格子に均等に分割し、ポイントを描くことも考えられます。どなたか他の方法をご存じないでしょうか?リストを定義して、それをただ循環させるのは除外します。また、私は一般的に、それらが衝突するか、または美しく見えないことを気にしない、それらは視覚的に区別されなければならないと言うべきです。

public static List<Color> pick(int num) {
    List<Color> colors = new ArrayList<Color>();
    if (num < 2)
        return colors;
    float dx = 1.0f / (float) (num - 1);
    for (int i = 0; i < num; i++) {
        colors.add(get(i * dx));
    }
    return colors;
}

public static Color get(float x) {
    float r = 0.0f;
    float g = 0.0f;
    float b = 1.0f;
    if (x >= 0.0f && x < 0.2f) {
        x = x / 0.2f;
        r = 0.0f;
        g = x;
        b = 1.0f;
    } else if (x >= 0.2f && x < 0.4f) {
        x = (x - 0.2f) / 0.2f;
        r = 0.0f;
        g = 1.0f;
        b = 1.0f - x;
    } else if (x >= 0.4f && x < 0.6f) {
        x = (x - 0.4f) / 0.2f;
        r = x;
        g = 1.0f;
        b = 0.0f;
    } else if (x >= 0.6f && x < 0.8f) {
        x = (x - 0.6f) / 0.2f;
        r = 1.0f;
        g = 1.0f - x;
        b = 0.0f;
    } else if (x >= 0.8f && x <= 1.0f) {
        x = (x - 0.8f) / 0.2f;
        r = 1.0f;
        g = 0.0f;
        b = x;
    }
    return new Color(r, g, b);
}

解決方法は?

を使用することができます。 HSLカラーモデル を使用して色を作成します。

色相が異なるだけで、明度や彩度がわずかに異なるだけなら、このように色相を分配することができます。

// assumes hue [0, 360), saturation [0, 100), lightness [0, 100)

for(i = 0; i < 360; i += 360 / num_colors) {
    HSLColor c;
    c.hue = i;
    c.saturation = 90 + randf() * 10;
    c.lightness = 50 + randf() * 10;

    addColor(c);
}