2

私はランダムな生成(およびランダムな色)が好きなので、両方を組み合わせて、単純な2Dランドスケープジェネレーターを作成することにしました。私の考えは、ブロックの高さに応じて(そうです、地形はブロックでできています)、ブロックを明るくしたり暗くしたりします。上部に最も近いものは明るく、下部に向かっては暗くなります。グレースケールで動作させましたが、RGB値の比率などが使用できないように見えるため、ベースRGBカラーを実際に使用して明るくすることはできません。解決?HSL。またはおそらくHSV、正直なところ、私はまだ違いを知りません。私はH0-360、S&V / L=0-100を参照しています。でも...まあ、360 = 0なので、360の値ですが、実際に0-100の場合、それは101です。実際には0-359と1-100(または0-99?)ですが、色の選択編集者(現在GIMPを参照しています...

とにかく、HSL-> RGB変換の式を見つけました(ここここ。私が知る限り、最終的な式は同じですが、それでもコードを提供します(これは後者のeasyrgb.comリンクからのものであることに注意してください) :

Hue_2_RGB

float Hue_2_RGB(float v1, float v2, float vH)             //Function Hue_2_RGB
{
if ( vH < 0 )
    vH += 1;

if ( vH > 1 )
    vH -= 1;

if ( ( 6 * vH ) < 1 )
    return ( v1 + ( v2 - v1 ) * 6 * vH );

if ( ( 2 * vH ) < 1 )
    return ( v2 );

if ( ( 3 * vH ) < 2 )
    return ( v1 + ( v2 - v1 ) * ( ( 2 / 3 ) - vH ) * 6 );

return ( v1 );
}

および他のコード:

float var_1 = 0, var_2 = 0;

        if (saturation == 0)                       //HSL from 0 to 1
        {
           red = luminosity * 255;                      //RGB results from 0 to 255
           green = luminosity * 255;
           blue = luminosity * 255;
        }
        else
        {
            if ( luminosity < 0.5 )
                var_2 = luminosity * (1 + saturation);
            else
                var_2 = (luminosity + saturation) - (saturation * luminosity);

            var_1 = 2 * luminosity - var_2;

            red = 255 * Hue_2_RGB(var_1, var_2, hue + ( 1 / 3 ) );
            green = 255 * Hue_2_RGB( var_1, var_2, hue );
            blue = 255 * Hue_2_RGB( var_1, var_2, hue - ( 1 / 3 ) );
        }

申し訳ありませんが、それらの空白を修正する良い方法がわかりません。

H、S、Lの値を自分の名前、色相、彩度、明度に置き換えました。振り返ってみましたが、足りないものがない限り正しく交換しました。ただし、hue_2_RGB関数は、C ++に必要な部分を除いて、完全に編集されていません。(例:変数タイプ)。私はまた、すべてのint(R、G、B、H、S、L)を持っていましたが、それが私に起こりました... HSLは数式の浮動小数点でした-または、少なくとも、そうあるべきだと思われます。そこで、変数(var_1、var_2、すべてのv、R、G、B、色相、彩度、明度)をフロートに使用しました。だから私はそれがここでのある種のデータ損失エラーであるとは信じていません。さらに、数式を入力する前に、色相/ = 360、彩度/ = 100、明度/ = 100があります。その前に、色相= 59、彩度= 100、明度=70があることに注意してください。 0-1を確保するために360として正しい色相、

だから、私の質問は、なぜ式が機能しないのですか?あなたが助けることができればありがとう。

編集:質問が明確でない場合は、コメントしてください。

4

1 に答える 1

0

あなたの前提は間違っています。RGBカラーをスケーリングするだけです。たとえば、Java の Color クラスには .darker() および .brighter() というコマンドが含まれています。これらは .7 の係数を使用しますが、必要なものは何でも使用できます。

public Color darker() {
    return new Color(Math.max((int)(getRed()  *FACTOR), 0),
                     Math.max((int)(getGreen()*FACTOR), 0),
                     Math.max((int)(getBlue() *FACTOR), 0),
                     getAlpha());
}

public Color brighter() {
    int r = getRed();
    int g = getGreen();
    int b = getBlue();
    int alpha = getAlpha();

    /* From 2D group:
     * 1. black.brighter() should return grey
     * 2. applying brighter to blue will always return blue, brighter
     * 3. non pure color (non zero rgb) will eventually return white
     */
    int i = (int)(1.0/(1.0-FACTOR));
    if ( r == 0 && g == 0 && b == 0) {
        return new Color(i, i, i, alpha);
    }
    if ( r > 0 && r < i ) r = i;
    if ( g > 0 && g < i ) g = i;
    if ( b > 0 && b < i ) b = i;

    return new Color(Math.min((int)(r/FACTOR), 255),
                     Math.min((int)(g/FACTOR), 255),
                     Math.min((int)(b/FACTOR), 255),
                     alpha);
}

つまり、3 つの色すべてに同じ静的係数を掛けると、色の比率が同じになります。これは損失の多い操作であり、範囲内に収まるように色を圧着する必要があります (丸め誤差よりも損失が大きくなります)。

率直に言って、RGB から HSV への変換は単なる数学であり、HSV V 係数の変更は単なる数学であり、それを元に戻すことはより数学的なことです。そんなものは必要ありません。計算するだけです。これにより、色間の比率を台無しにすることなく、最大コンポーネントの色を大きくすることができます。

--

質問がより具体的で、単により良い結果が必要な場合。これを計算するより良い方法があります。明度を静的にスケーリングするのではなく (L は明度を意味しません)、輝度コンポーネントに変換できます。これは基本的に特定の方法で重み付けされています。カラーサイエンスとコンピューティングは人間の観察者を扱っており、実際の数学よりも重要です. これらの人間の癖のいくつかを説明するには、平均的な人間が知覚するものに近づけるために「物事を修正」する必要があります。輝度は次のようにスケーリングします。

Y = 0.2126 R + 0.7152 G + 0.0722 B

これは、適切な色距離の重みであると誤って考えられている重み 30、59、11 にも同様に反映されています。これらの重みは、人間の明るさの知覚に対する色の寄与です。たとえば、最も明るい青は、人間にはかなり暗く見えます。一方、黄色(青とは正反対)は非常に明るく見えるため、白い背景に対してさえそれを確認することはできません. Y'CbCr に含まれる多くの色空間は、スケーリングによる明るさの認識の違いを説明します。その後、その値を変更すると、元に戻すと再びスケーリングされます。

これは、人間が同じ色の「より明るい」バージョンであると言うことに似ているはずです。この人間のシステムにはますます優れた近似があり、それを説明するために、より優れたより手の込んだ数学を使用すると、通常、より良い結果が得られます。

これらの問題に触れる良い概要については。 http://www.compuphase.com/cmetric.htm

于 2012-09-06T09:35:36.673 に答える