由于尝试使颜色饱和的数据类型范围有限,比较总是错误的

Comparison is always false due to limited range of data type trying to saturate colors

我正在尝试使我的颜色饱和并确保它们不会溢出 这样他们就可以画出漂亮的 Mandlebrot 集而不会被像素化。 我正在使用 Altera DE2 开发板尝试通过 VGA 连接将此 Mandlebrot 集打印到计算机屏幕上,但颜色略有偏差(像素)。

如何更正下面代码中的 if 语句使其不总是错误的?

if (iteration == 500)
{
    alt_up_pixel_buffer_dma_draw(my_pixel_buffer,0,0,0);
}
else
{
    //double z = sqrt(xtemp * xtemp + y * y);
    //int brightness = 256. * log2(1.75 + i - log2(log2(z))) / log2(500);
    //color(brightness, brightness, 255);
    //color is some function of iteration
    alt_u8 Red = (iteration*8);///zoom);
    if(Red > 255) // this if statement is always false
        Red = 255;

    alt_u8 Green = (iteration*4);///zoom);
    if(Green > 255) // this if statement is always false
        Green = 255;

    alt_u8 Blue = (iteration*2);///zoom);
    if(Blue > 255) // this if statement is always false
        Blue = 255;

    //draw the pixels
    alt_up_pixel_buffer_dma_draw(my_pixel_buffer, (Blue) + (Green<<8) + (Red<<16),j,i);
}

您需要使用更大的整数来得到乘法的结果,所以您可以测试它是否超过限制。

alt_u8 Red;
uint16_t tempRed = iteration * 8;
if (tempRed > 255) {
    Red = 255;
} else {
    Red = tempRed;
}

由于可以存储在 alt_u8 中的最大值是 255,因此没有必要检查它是否包含更大的值。 (如果不是这种情况,即使 alt_u8 的类型不可见,您也不会收到警告。)

然而,这也意味着你的赋值是危险的,因为赋值是以 256 为模存储的。你可能需要使用:

alt_u32 new_Red = iteration * 8;  // Guessed type; uint32_t or uint16_t would do
alt_u8 Red = new_Red;
if (new_Red > 255)
    Red = 255;

现在 new_Red 中的值可以超过 255,但赋值确保饱和值被存储,而不是 new_Red % 256 否则将被存储。