Вы можете использовать линейную интерполяцию для смешивания значений R, G и B (и A, если хотите). Вот пример кода для проекта Windows Form. Просто добавьте TrackBar с диапазоном от 0 до 400 и проволоки до EVENT прокрутки, TrackBar к ниже обработчика:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
byte interpolate(byte a, byte b, double p)
{
return (byte)(a * (1 - p) + b * p);
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
int v = trackBar1.Value;
BackColor = getColor(v);
}
private Color getColor(int v)
{
SortedDictionary<int, Color> d = new SortedDictionary<int, Color>();
d.Add(0, Color.Blue);
d.Add(100, Color.Green);
d.Add(200, Color.Yellow);
d.Add(300, Color.Orange);
d.Add(400, Color.Red);
KeyValuePair<int, Color> kvp_previous = new KeyValuePair<int,Color>(-1, Color.Black);
foreach (KeyValuePair<int, Color> kvp in d)
{
if (kvp.Key > v)
{
double p = (v - kvp_previous.Key)/(double)(kvp.Key - kvp_previous.Key);
Color a = kvp_previous.Value;
Color b = kvp.Value;
Color c = Color.FromArgb(
interpolate(a.R, b.R, p),
interpolate(a.G, b.G, p),
interpolate(a.B, b.B, p));
return c;
}
kvp_previous = kvp;
}
return Color.Black;
}
}
Вы также можете использовать эту идею HSL цвета, как предложено nobugz.
Примечание: этот код является просто доказательством концепции. В реальном приложении вы хотели бы создать класс, чтобы инкапсулировать логику выбора цвета, сделать ее более настраиваемой, обрабатывать ошибки и т. Д. Это также не оптимизировано для скорости. Если скорость является важным соображением, то вместо этого вы, вероятно, должны использовать справочную таблицу.
Почему бы 350 средняя 50% желтого и 50 % Оранжевый? Я потерялся. –
Err ... Blue = 0, зеленый = 100, желтый = 200, оранжевый = 300, ??? = 400 –
К сожалению, я добавил красный в массив. Таким образом, 350 будет красным/оранжевым. – jimj