由于尝试使颜色饱和的数据类型范围有限,比较总是错误的
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
否则将被存储。
我正在尝试使我的颜色饱和并确保它们不会溢出 这样他们就可以画出漂亮的 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
否则将被存储。