進値が示唆するようあなたは明るい色に明るい色から予定している場合、あなたはむしろ、RGB空間よりも、HSV spaceで補間することを望むかもしれません。 HSV空間は、色相、彩度および価値についてどのように考えているかを概算します。 RGB空間は、我々の目の光感受性細胞がどのように働くかを近似する。
上側勾配は、FF0000から00FF00までの線形RGB補間です。その真ん中の値は7f7f00で、泥だらけの茶色です。
中間勾配は、HSV空間の線形補間です。 FF0000と00FF00の両方が完全に飽和し、同じ値(明るさ)を持つので、補間は同じ輝度と彩度を維持しますので、中央値は明るい黄色ffff00です。
第3の代替案は、中間値がB4B400(B4hex = 180 dec = 255/sqrt(2))であることを意味する、RGB空間におけるベクトル回転であり、これは2つの効果の間にある。これは、各端点の大きさを計算し、RGB線形補間の結果を同じ大きさになるようにスケーリングして、2つの色の平面と原点の円弧内のベクトルを効果的にスイープします。実際に明るさのために異なる色を均等に重み付けしたり、直線的に見ることはしませんが、それは正確ではありませんが、HSVは中央で少し明るいのに対し、スイープではかなり均一な強度を持っています。 100%である。あなたはHSBのアルゴリズムをサポートしていたJavaでは、
削除死んImageShackのリンク
簡単です - 終了値のHSB、線形を変換し、その後、他のRGBの答えのようにそれらを補間ますV値、sは、時間とともに色を作成します。
static Color hsvInterpolate (float mix, Color c0, Color c1) {
float[] hsv0 = new float[3];
float[] hsv1 = new float[3];
float alt = 1.0f - mix;
Color.RGBtoHSB(c0.getRed(), c0.getGreen(), c0.getBlue(), hsv0);
Color.RGBtoHSB(c1.getRed(), c1.getGreen(), c1.getBlue(), hsv1);
float h = mix * hsv0 [ 0 ] + alt * hsv1 [ 0 ];
float s = mix * hsv0 [ 1 ] + alt * hsv1 [ 1 ];
float v = mix * hsv0 [ 2 ] + alt * hsv1 [ 2 ];
return Color.getHSBColor (h, s, v);
}
私はC#は内蔵の変換を持っていると信じていないので、コードは実際に多くの使用ではありません。
static Color vectorInterpolate (float mix, Color c0, Color c1) {
float alt = 1.0f - mix;
double x0 = c0.getRed();
double y0 = c0.getGreen();
double z0 = c0.getBlue();
double x1 = c1.getRed();
double y1 = c1.getGreen();
double z1 = c1.getBlue();
double mag0 = sqrt(x0*x0 + y0*y0 + z0*z0);
double mag1 = sqrt(x1*x1 + y1*y1 + z1*z1);
double x = mix * x0 + alt * x1;
double y = mix * y0 + alt * y1;
double z = mix * z0 + alt * z1;
double mag = mix * mag0 + alt * mag1;
double scale = mag/sqrt(x*x + y*y + z*z);
return new Color (
clamp (x * scale),
clamp (y * scale),
clamp (z * scale));
}
static int clamp (double value) {
int x = (int) round (value);
if (x > 255) return 255;
if (x < 0) return 0;
return x;
}
おそらくRGB立方体の辺のベクトルの交点ではなく、単にそれをクランプを見つけたいが、この場合には、それはどちらの方法でもかまいません。添加物として
Dave Green's cube helix
色補間によって示されるように、それは、また、知覚される明るさに近いHSY空間を検討する価値があります。
どちらも正しいです。両方の人に答えを与えたいと思います。 –
チャット・バーチはピート・カークハムの答えよりもはるかに簡単なので、スコットは良い選択をしました。 –