Похоже, что вы после линейной интерполяции - в вашем случае, интерполяция от белого до указанного цвета. Например, в C #:
public IEnumerable<Color> Interpolate(Color from, Color to, int steps)
{
int range = steps-1; // Makes things a bit easier
for (int i=0; i < steps; i++)
{
// i is the proportion of the "to" colour to use.
// j is the proportion of the "from" colour to use.
int j = range - i;
int r = ((from.R * j) + (to.R * i)) / range;
int g = ((from.G * j) + (to.G * i)) / range;
int b = ((from.B * j) + (to.B * i)) / range;
yield return new Color(r, g, b);
}
}
Конечно, есть и другие способы сделать это, кроме линейной интерполяции, но это, вероятно, будет самым простым. Обратите внимание, что это становится сложным, если у вас много шагов или больших значений, потому что вам нужно учитывать возможность переполнения. В этом случае вы должны быть в порядке - вам вряд ли понадобится более 256 шагов, а максимальное значение - 255, поэтому вы не приблизитесь к пределам int
с.
РЕДАКТИРОВАТЬ: Как отмечено в комментариях, RGB, возможно, не является лучшей областью для использования линейной интерполяции. Возможно, вам лучше всего преобразовать значения from / to RGB в HSL или HSV и выполнить их интерполяцию. Это может быть легко или сложно в зависимости от вашей платформы. Ссылка на википедию в предыдущем предложении дает формулы для соответствующих вычислений, если они вам не предоставлены.