Для школьного задания мне нужно создать .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;
}
Основная проблема с кодом, как представлено, состоит в том, что он использует целочисленная арифметика. Таким образом, например x / 255
дает 0 для каждого x
значение меньше 255. Это вычисление должно выполняться с плавающей запятой (желательно типа double
, что по умолчанию), что вы можете сделать, просто написав x / 255.0
, а затем с окончательным результатом преобразуется в целое число.
Таким образом, благодаря надежным вычислениям, вам будет легче обнаружить другие проблемы.
С надеждой. 😉
Других решений пока нет …