グラデーション関数作成
学校の宿題のグラデーション関数を作成。
開始点と終了点、開始色と終了色を指定して、
直線のグラデーションを作るだけですが、、。
たったこれだけに、5h程かかりました…ふい〜(´Д`;
なんというか、数学の力がものすごく不足してますね…。(トホホ…。
// ============================================================================ // 汎用グラデーション作成 // @param x1, y1 開始点 // @param y2, y2 終了点 // @param *fromColor 24ビットRGB構造体(開始色) // @param *toColor 24ビットRGB構造体(終了色) // ============================================================================ void gradation::MakeGradation(BITMAP *bitmap, int x1, int y1, int x2, int y2, COLOR24 *fromColor, COLOR24 *toColor) { int dx = x2 - x1; int dy = y2 - y1; float rate = (float)dy / dx; // x方向への開始直線 y1 = a1 * x1 + b1となる式を求める float a1 = -1 / rate; // 傾き float b1 = y1 - (a1 * x1); // 切片 // x方向への終了直線 y2 = a2 * x2 + b2となる式を求める float a2 = a1; float b2 = y2 - (a2 * x2); // x方向への色の増加率を求める float rateColor = (b2 - b1) * rate; if(rateColor < 0) rateColor *= -1; COLOR24_F colorF = { (toColor->r - fromColor->r) / rateColor, (toColor->g - fromColor->g) / rateColor, (toColor->b - fromColor->b) / rateColor }; for(int j = 0; j < bitmap->info_header.biHeight; j++) { // x座標のグラデーション開始点と終了点を求める // y = a * x + b を x = (b - y) / a に変形 int startX = (int)((j - b1) / a1); int endX = (int)((j - b2) / a2); COLOR24_F tmpColorF = { fromColor->r, fromColor->g, fromColor->b }; if(startX < 0) { for(int i = 0; i > startX; i--) { if(startX <= i && i <= endX) { tmpColorF.r += colorF.r; tmpColorF.g += colorF.g; tmpColorF.b += colorF.b; } } } for(int i = 0; i < bitmap->info_header.biWidth; i++) { if(startX <= i && i <= endX) { // グラデーションする範囲 tmpColorF.r += colorF.r; tmpColorF.g += colorF.g; tmpColorF.b += colorF.b; } bitmap->pixel_data[j][i][0] = (unsigned char)tmpColorF.r; bitmap->pixel_data[j][i][1] = (unsigned char)tmpColorF.g; bitmap->pixel_data[j][i][2] = (unsigned char)tmpColorF.b; } } }
しかも、dxやdyが0になるときや、
dyがマイナスのときは、
うまくいきません…(´Д`;