Перевод температуры в RGB - C#
Формулировка задачи:
Поскольку прога пишется на C# то решил написать в этом разделе.
Задание такое: Есть целочисленная матрица со значениями от -500 до + 500 (к примеру).
Необходимо в зависимости от значения числа закрасить ячейку таблицы нужным цветом.
То есть например -500, поскольку эта самая холодная температура в матрице, то ячейка должна быть закрашена тёмно-синим цветом, а при +500 тёмно-красным цветом.
Необходим алгоритм для перевода темепературы, заданной в числах, в в цвет RGB, безусловно если такой существует. Или придётся самому алгоритм выдумывать???
Решение задачи: «Перевод температуры в RGB»
textual
Листинг программы
public static Color ColorFromAhsb(int a, float h, float s, float b) {
if (0 > a || 255 < a) {
throw new ArgumentOutOfRangeException("a", a,
Properties.Resources.InvalidAlpha);
}
if (0f > h || 360f < h) {
throw new ArgumentOutOfRangeException("h", h,
Properties.Resources.InvalidHue);
}
if (0f > s || 1f < s) {
throw new ArgumentOutOfRangeException("s", s,
Properties.Resources.InvalidSaturation);
}
if (0f > b || 1f < b) {
throw new ArgumentOutOfRangeException("b", b,
Properties.Resources.InvalidBrightness);
}
if (0 == s) {
return Color.FromArgb(a, Convert.ToInt32(b * 255),
Convert.ToInt32(b * 255), Convert.ToInt32(b * 255));
}
float fMax, fMid, fMin;
int iSextant, iMax, iMid, iMin;
if (0.5 < b) {
fMax = b - (b * s) + s;
fMin = b + (b * s) - s;
} else {
fMax = b + (b * s);
fMin = b - (b * s);
}
iSextant = (int)Math.Floor(h / 60f);
if (300f <= h) {
h -= 360f;
}
h /= 60f;
h -= 2f * (float)Math.Floor(((iSextant + 1f) % 6f) / 2f);
if (0 == iSextant % 2) {
fMid = h * (fMax - fMin) + fMin;
} else {
fMid = fMin - h * (fMax - fMin);
}
iMax = Convert.ToInt32(fMax * 255);
iMid = Convert.ToInt32(fMid * 255);
iMin = Convert.ToInt32(fMin * 255);
switch (iSextant) {
case 1:
return Color.FromArgb(a, iMid, iMax, iMin);
case 2:
return Color.FromArgb(a, iMin, iMax, iMid);
case 3:
return Color.FromArgb(a, iMin, iMid, iMax);
case 4:
return Color.FromArgb(a, iMid, iMin, iMax);
case 5:
return Color.FromArgb(a, iMax, iMin, iMid);
default:
return Color.FromArgb(a, iMax, iMid, iMin);
}
}