Создание флага в C через PPM

Я пытаюсь создать флаг Дании в C через PPM, но я не могу заставить свою функцию работать, а также хочу найти более эффективный способ соединить все места вместе, а не делать все 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);
}

Также по какой-то причине моя функция будет компилироваться... Может ли кто-нибудь помочь мне в этом вопросе?

1 ответ

Прочитайте, как использовать логические операторы && и || ,

Нет необходимости добавлять отдельные проверки для "левого красного, среднего белого, красного цвета", вы можете предположить, что вы рисуете красным цветом и проверяете только среднюю часть.

Так как вы хотите, чтобы рисовать в белом, когда [х> 0.3 && х <= 0,4] или [у> 0,3 && у <= 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 <i>x</i> в эту функцию немного не помогает, поскольку оно не подсчитывает ничего, что вас интересует.)

Наконец, я настоятельно рекомендовал использовать y вместо i для итерации явно-Y-значения. Я заметил, что использовал это "инстинктивно" в своих объяснениях.

После исправления нескольких меньших проблем (например, Pixel выводит три цифры, разделенных пробелом, но если вы вызовете его второй раз, первая новая цифра будет придерживаться предыдущей), я получил следующее:

в формате PPM, который я мог бы правильно открыть в Photoshop (а затем преобразовать в PNG, потому что SO не любит изображения PPM).

licensed under cc by-sa 3.0 with attribution.