2017-09-28 19 views
-3

この関数を使用してHSVからRGBへの変換を改善しようとしていますが、floatを使用しないと少し問題があります。 。(C言語)

HsvColor hsv; 
unsigned char rgbMin, rgbMax; 

rgbMin = rgb.r < rgb.g ? (rgb.r < rgb.b ? rgb.r : rgb.b) : (rgb.g < rgb.b ? rgb.g : rgb.b); 
rgbMax = rgb.r > rgb.g ? (rgb.r > rgb.b ? rgb.r : rgb.b) : (rgb.g > rgb.b ? rgb.g : rgb.b); 

hsv.v = rgbMax; 
if (hsv.v == 0) 
{ 
    hsv.h = 0; 
    hsv.s = 0; 
    return hsv; 
} 

hsv.s = 255 * (long int)(rgbMax - rgbMin)/hsv.v; 
if (hsv.s == 0) 
{ 
    hsv.h = 0; 
    return hsv; 
} 

if (rgbMax == rgb.r) 
    hsv.h = 0 + 43 * (rgb.g - rgb.b)/(rgbMax - rgbMin); 
else if (rgbMax == rgb.g) 
    hsv.h = 85 + 43 * (rgb.b - rgb.r)/(rgbMax - rgbMin); 
else 
    hsv.h = 171 + 43 * (rgb.r - rgb.g)/(rgbMax - rgbMin); 

return hsv; 

私の問題は、私はfloatを使用しなくても、私は切り捨てられた値を持つ、(rgb.b-rgb.r)<1を持っているということである(そう0)と常にhsv.h滞在85時...

hsv.h = 85 + 43 *(rgb.b - rgb.r)/(rgbMax - rgbMin);

誰もが考えていますか?

+2

タイトルには言語は必要ありません。これは、どのタグ用のものですか。タイトルがあなたが選んだタグと一致しないときは特に愚かです。私はあなたがこの質問を見たと思うだろう、あるいはあなたのタイトルはかなりの偶然です... https://stackoverflow.com/questions/3018313/algorithm-to-convert-rgb-to-hsv-and-hsv-to -rgb-in-range-0-255-for-bothなぜfloatを使用できないのですか?固定小数点を考えましたか? –

+1

'.b'と' .r'はおそらく整数なので、減算の結果を 'float'に変換すると違いはありません。あなたの質問は不明なようです。 –

+0

私はfloatを使うことができません... .bと.rは構造体で設定した符号なしの文字です。 –

答えて

0

小数点以下3桁の精度の場合、操作の前にオペランドに1000を掛けます。このようにして(rgb.b-rgb.r) <1の代わりに1000*(rgb.b-rgb.r) < 1000が得られます。その結果、0に切り捨てることはありません。 rとbの型は255 * 1000を含むのに十分な幅です。

+0

しかし 'rgb.b'と' rgb.r'は 'unsigned char'なので、数字。 '(rgb.b-rgb.r)<1'が真であるためには、実際には'(rgb.b-rgb.r)= 0'を持っていなければなりません。 1,000を掛けても差はありません。 – TripeHound