Создание двух цветных линейных градиентов .ppm в Stack Overflow

Для школьного задания мне нужно создать .ppm файл, который является градиентом от одного цвета к другому, используя C ++. Я также должен определить количество столбцов и строк .ppm файл имеет. Я не знаю, как математически создать цвет градиента. Может ли кто-нибудь помочь с математикой и кодом для достижения этой цели?

Пока что мне удалось вывести цвет, я просто не знаю, как сделать его градиентным.

Вот мой код до сих пор:

#include <iostream>
#include <fstream>

using namespace std;

struct Color{
int r;
int g;
int b;
};

void Grad(int rows, int cols, Color c1, Color c2, string filename);

void Grad(int rows, int cols, Color c1, Color c2, string filename){
ofstream out(filename + ".ppm");

int y;
int x;

out << "P6\n"<< cols << " " << rows << "\n"<< "255\n";

for (y = 0; y < rows; y++){

for (x = 0; x < cols; x++) {

unsigned char r,g,b;

r = (c1.r + ((x / 255) * (c2.r - c1.r)));
g = (c1.g + ((x / 255) * (c2.g - c1.g)));
b = (c1.b + ((x / 255) * (c2.b - c1.b)));

out << r << g << b;

}

}
}

int main(){
string bw = "blackToWhite";
string ry = "redToYellow";
string fb = "fooToBar";

Color black; black.r=0; black.g=0; black.b=0;
Color white; white.r=255; white.g=255; white.b=255;
Color red; red.r=255; red.g=0; red.b=0;
Color yellow; yellow.r=255; yellow.g=255; yellow.b=0;
Color foo; foo.r=21; foo.g=156; foo.b=221;
Color bar; bar.r=253; bar.g=24; bar.b=129;

Grad(64,256,black,white,bw);
Grad(400,2000,red,yellow,ry);
Grad(234,800,foo,bar,fb);

return 0;

}

0

Решение

Основная проблема с кодом, как представлено, состоит в том, что он использует целочисленная арифметика. Таким образом, например x / 255 дает 0 для каждого x значение меньше 255. Это вычисление должно выполняться с плавающей запятой (желательно типа double, что по умолчанию), что вы можете сделать, просто написав x / 255.0, а затем с окончательным результатом преобразуется в целое число.

Таким образом, благодаря надежным вычислениям, вам будет легче обнаружить другие проблемы.

С надеждой. 😉

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]