Каков был бы корректный способ преобразовать значение цвета от плавания до байта? Сначала я думал b=f*255.0
должен сделать это, но теперь я думаю, это в этом случае только точное 1.0
будет преобразован в 255
, но 0.9999
уже будет 254
который является, вероятно, не, что я хочу...
Это кажется этим b=f*256.0
было бы лучше за исключением того, что это будет иметь нежелательный случай создания 256
в случае точного 1.0
.
В конце я использую это:
#define F2B(f) ((f) >= 1.0 ? 255 : (int)((f)*256.0))
1.0 is the only case that can go wrong, so handle that case separately:
b = floor(f >= 1.0 ? 255 : f * 256.0)
Also, it might be worth forcing that f really is 0<=f<=1 to avoid incorrect behaviour due to rounding errors (eg. f=1.0000001).
f2 = max(0.0, min(1.0, f))
b = floor(f2 == 1.0 ? 255 : f2 * 256.0)
Alternative safe solutions:
b = (f >= 1.0 ? 255 : (f <= 0.0 ? 0 : (int)floor(f * 256.0)))
or
b = max(0, min(255, (int)floor(f * 256.0)))
I believe the correct is floor(f*256), not round. This will map the interval 0..1 to exactly 256 zones of equal length.
[EDIT] and check 256 as a special case.
Почему бы не попробовать что-нибудь вроде
b=f*255.999
Избавляется от специального случая f==1
, но 0.999 - это все равно 255