1. ホーム
  2. language-agnostic

[解決済み] パワーメーターの赤と緑の間の色を生成する?

2022-05-13 22:48:45

質問

Javaでゲームを作っているのですが、何かを強く撃つときのパワーメーターを実装したいのです。

0~100のintを取り、その数値の高さに応じて、緑(パワースケール0)と赤(パワースケール100)の間の色を返す関数を書きたいのですが、可能でしょうか?

ボリュームコントロールがどのように機能するかに似ています。

緑と赤の間の色を生成するには、色の赤、緑、青の成分に対してどのような操作をすればよいのでしょうか。

だから、私は以下を実行することができます。 getColor(80) を実行すると、オレンジ系の色(R, G, B の値)を返します。 getColor(10) とすると、より緑や黄色に近いRGB値を返します。

新しい色のために R、G、B 値のコンポーネントを増やす必要があることは分かっていますが、色が緑から赤にシフトするときに何が上がるか下がるかは具体的に分かっていません。


進捗状況です。

結局、HSV/HSB 色空間を使用することにしました。なぜなら、グラデーションがより好きだったからです (中央に暗い茶色がない)。

私が使用した関数は

public Color getColor(double power)
{
    double H = power * 0.4; // Hue (note 0.4 = Green, see huge chart below)
    double S = 0.9; // Saturation
    double B = 0.9; // Brightness

    return Color.getHSBColor((float)H, (float)S, (float)B);
}

ここで "power" は 0.0 から 1.0 の間の数値である。 0.0は明るい赤を返し、1.0は明るい緑を返します。

Java色相図です。

どのように解決するのですか?

赤と緑の値をリニアにスケーリングすればよいのです。赤、緑、青の最大値を次のように仮定します。 255 で、かつ n は範囲 0 .. 100

R = (255 * n) / 100
G = (255 * (100 - n)) / 100 
B = 0

(整数計算のために修正。Ferrucioに脱帽)

別の方法としては HSVカラーモデル を使用し、色相を 0 degrees (赤) から 120 degrees (緑) に、好きな彩度と値で変換します。これで、より美しいグラデーションになるはずです。

上のグラデーションはRGB、下のグラデーションはHSVを使用しています。