我试图让我的颜色饱和,并确保它们不会溢出 这样他们就可以画出漂亮的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);
}
答案 0 :(得分:1)
您需要使用更大的整数来获取乘法的结果,因此您可以测试它是否超出限制。
alt_u8 Red;
uint16_t tempRed = iteration * 8;
if (tempRed > 255) {
Red = 255;
} else {
Red = tempRed;
}
答案 1 :(得分:0)
由于可以存储在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
,否则将存储。