0

我正在尝试通过 PPM 在 C 中设计丹麦国旗,但我似乎无法让我的功能正常工作,因为我想找到一种更有效的方法将所有地方循环在一起,而不是做所有 if/else if陈述。

 for(i=0; i < height; i++){
  for(x=0; x < width; x++){
    if(x <= width *.3 && i <= height * .3)
   {
     printf("%i", Pixel(255,51,51));
   }
    else if(x<= width * .1 && i <= height *.1)
   {
     printf("%i",Pixel(0,0,0));
   }
    else if(x <= width * .405 && i <= height *.3)
   {
     printf("%i", Pixel(255,51,51));
   }
    else if(x <= width * .4 && i <= height)
   {
     printf("%i", Pixel(0,0,0));
   }
    else
   {
     printf("%i", Pixel(255,51,51));
   }
 }
}

这是我的身体,我不知道如何循环在一起,而不是创建大量的 if/else 语句,其中一半时间可能不起作用....

void Pixel(int red, int green, int blue){
  printf("%i %i %i", red, green, blue);
}

同样出于某种原因,我的函数将编译...有人也可以帮助我解决这个问题吗?

4

1 回答 1

0

阅读有关如何使用逻辑运算符&&||.

无需为“左红、中白、右红”添加单独的检查,您可以假设您正在绘制红色并且只检查中间部分。

由于您想在 [x > 0.3 && x <= 0.4][y > 0.3 && y <= 0.4] 时绘制白色,因此您可以将其连接到单个if检查中。黑色边框也是如此——它只需要一次检查。

if (x < width * .1 || y < height * .1 || x > width * .9 || y > height * .9)
  ..black..
else
  if ((x > width *.3 && x <= width * .4) || (y > height *.3 && y <= height * .4))
    ..white..
  else
    ..red..

另外:您的 Pixel 例程已经打印了 RGB 值,因此在调用它时无需再次尝试。现在发生的事情是

printf("%i", Pixel(255,51,51));

首先打印 R、G、B 值,然后尝试Pixel打印调用函数的“结果” 。这失败Pixel了,因为没有返回值。你的编译器应该已经警告你了,所以请检查你的编译设置。(但请注意,在该函数中添加一条语句并没有什么帮助,因为它不会计算您感兴趣的任何内容。)return x

最后,我强烈建议使用y而不是i迭代一个明显的 Y 值。我注意到我在解释中使用了“本能”。

在修复了一些较小的问题后(​​例如,Pixel输出由空格分隔的三个数字,但如果你第二次调用它,第一个新数字将与前一个数字保持一致)我得到了这个:

丹麦国旗

以 PPM 格式,我可以在 Photoshop 中正确打开(然后转换为 PNG,因为 SO 不喜欢 PPM 图像)。

于 2013-11-15T10:10:36.613 回答