グラデーション関数作成

学校の宿題のグラデーション関数を作成。
 
開始点と終了点、開始色と終了色を指定して、
直線のグラデーションを作るだけですが、、。
 
たったこれだけに、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がマイナスのときは、
うまくいきません…(´Д`;