2017-10-18 5 views
0

WPFのColor構造体で動作するメソッドを記述して、Colorの色相を表すバイトを返すようにしています。私は式に苦しんでいる、私は黒の色(255,255,255)、赤(255,0,0)、緑(0,255,0)、青(0,0,255)の単体テストを書いている。黄色(255,255,0)、シアン(0,255,255)、マゼンタ(255,0255)、白(255,255,255) - イエロー(42 )とMagenta(212の代わりに-1を返しますが、-1として失敗するとバイトにキャストされません)。次のように​​ため色の色相を0から255の範囲として計算する

マイ拡張メソッドが表示されます

public static byte GetHue(this Color color) 
    => GetHue(color.ToRgbDictionary(), color.GetMinComponent(), color.GetMaxComponent()); 

private static byte GetHue(Dictionary<ColorComponent, byte> rgbDictionary, ColorComponent minimumRgbComponent, ColorComponent maximumRgbComponent) 
{ 
    decimal chroma = rgbDictionary[maximumRgbComponent] - rgbDictionary[minimumRgbComponent]; 

    return (byte) 
    (
     chroma == 0 
     ? 0 
     : thirdOfByte 
     * (byte)maximumRgbComponent 
     + 
     (
      rgbDictionary[MathHelper.Wrap(maximumRgbComponent + 1)] 
      - rgbDictionary[MathHelper.Wrap(maximumRgbComponent - 1)] 
     ) 
     /chroma 
    ); 
} 

ToRgbDictionaryは単に、赤、緑、青の成分の辞書にColorを回します。 ColorComponentは、これらのコンポーネントのキーとして使用される列挙型です。 MathHelper.Wrapは、オーバーフローまたはアンダーフローの場合に、宣言された範囲に列挙型を戻す方法です。 GetMinComponentGetMaxComponentColorの2つの拡張メソッドで、ColorColorComponentの順番は、赤、緑、青)の最初の最低値と最初の最高値であるColorComponentを返します。 thirdOfByteは、byte.MaxValue/3に等しい定数です。

私はベースしている。このようになります。私はここで見つける別(​​)でこの式:

private decimal GetH(RGB rgb, decimal max, decimal chroma) 
{ 
    decimal h; 
    if (rgb.R == max) 
     h = ((rgb.G - rgb.B)/chroma); 
    else if (rgb.G == max) 
     h = ((rgb.B - rgb.R)/chroma) + 2M; 
    else 
     h = ((rgb.R - rgb.G)/chroma) + 4M; 
    return 60M * ((h + 6M) % 6M); 
} 

、式での問題は、それが0にマッピングされていますされて - 360色相範囲ではなく、0から255私が必要とする範囲です。私はこの数式の定数が何をしているのか分かりませんが、60は360/3 = 120と何か関係があると思いますので、同様のことをやろうとする私の3分の1のバイト定数です。 6Mの場合、私は彼らがどこから来たのか、なぜその段階で色相値に追加され、モジュレーションされるのか分かりません。数学の心を持っている人なら誰でも私を助けてくれますか?

UPDATE 0理由 - 255の範囲は、私はそれは色相、彩度、明度のために(図示のように)ソフトウェアの別の部分で使用さ見た必要とされたものをすべてだと思ったことでした。また、私は黄色の42色相値を取得しました。私は現在、16777216(256 * 256 * 256)の色範囲で可能なすべての色相をカバーする色相の正しい範囲を見つけることを試みています。

enter image description here

答えて

0
  • あなた... "(1の代わりに、42を返します)イエロー除く" 42を期待しての背後にあるロジックは何ですか?

  • "0 - 360色相範囲にマップされています"カラーホイールに360色相があるため、にマップされています。符号なしバイト(256の値を保持)があっても、他の104の可能な色相を切り取っています。それは正確な表現ではありません。

  • 2バイトのshortを使用して、1バイトを使用する代わりに360色相を保持するのはなぜですか?

    byte_value = hue_value/(360/255); //where hue_value is the 0-360 amount. 
    

    が最終バイト値としてなしの画分を取得するためにMath.roundようMath methodsを含む試してください:あなたはまだ255の範囲内の360に合うようにしたい場合は

は、単純な計算を行います。

例180色相:

byte_value = Math.round(180/(360/255)); //gives 127 
+0

私は0使用して再考している - 今、あなたはそれを言ったこと255。私は1バイトを節約するために価値の解決を失いたくない!つまり、私は今式をコピーすることができますが、私はそれを理解したいと思います(60M、2台の6M、4M、2Mの意味は何ですか?)。私はモジュラスを仮定します。小数は、その後の乗算(それ以降の丸めが適用される可能性があるため)が重要なためです。 – Sphynx

+0

明確にするために、255 * 255 * 255色の可能な色相の総数、またはこれらの色相を1度あたりの色相円にマッピングする方法がありますか?私は、色相を特定のユーザーコントロールの形にカップリングすることよりも精度が高いです。 – Sphynx

関連する問題