3

色が背景色に近いかどうかをチェックできる関数を書きたかったのです。

このために、HSLカラースキームを使用します。少し説明させてください。HSL色は、色相の彩度と明度として定義されます。要するに、色相は、使用されている虹の色とその範囲が0〜360であることを示しています。そして、色相について確認したいと思います。

そのため、純粋な色や灰色と混合した色、またはそれ自体を表す明度など、色の強さの彩度は比較されません。色相を確認したいだけです。最初に私はこのようなNear関数を書きました:

Private boolean Near(int background, int mycolor, int difference)
{
  if(math.abs( background - mycolor)<difference){return true;}else{return false}
}

後で私はこれが間違っていることに気づきました。HSLは下の画像のように色が円になっているため、赤0から始まり、360で再び赤になります。したがって、色相値358と4は接近しているため、上記の関数は反映されません。それ。

(彩度は中心に行きます0..100は明るくなります0..100は上下に移動するようなもので、色相は0〜360度です。)

ここに画像の説明を入力してください

mycolorたとえば、赤5と許容差が20である背景が、<5 + 20または>(360-(5-20​​))の範囲内にあるように、大きなifthen構造で関数を書き直すことができます。)..色相の差が0または360の制限を超える場合は、特別な構造を作成します。

それはうまくいくでしょうが、そのような「if then」構造を単一行のモジュロ計算に置き換えることができるのではないかと思いましたか?モジュロ計算を使用して境界内をチェックできるので、 360の境界を越えると、再びゼロに近い赤になります。

そうだと思いますが、そのような行には、ANDまたはORと減算またはABS関数も含まれている可能性があります。1つの比較行に書き込むことができるでしょうか。

4

1 に答える 1

0

あなたがする必要があるのは、あなたが比較している値が可能な限り近いことを確認することです。たとえば、、、およびの場合background = 358、からmycolor = 4減算することでそれらを近づけることができますが、これは実効値を変更しません。差が>である限り、それらを近づける必要があります。360background180

if (mycolor - background > 180) mycolor -= 360;
if (background - mycolor > 180) background -= 360;

これらの変換により、元のロジックは正しくなるはずです(これifは不要です)。

return Math.Abs(background - mycolor) < difference;

編集:私は正しいと思われるより単純な表現を見つけました。

return Math.Abs(background - mycolor) % (361 - difference) < difference;
于 2013-01-21T20:08:17.880 に答える