Я пытаюсь преобразовать звездочку индекс цвета B-V в кажущийся цвет RGB. Помимо поиска таблиц и цветовых рамп, кажется, что для этого не существует хорошо известного алгоритма.
Какой индекс цвета B-V?
Это число астрономов назначает звезде, чтобы указать ее видимый цвет. Горячие звезды (низкий B-V) являются синими/фиолетовыми, а холодные звезды (высокий B-V) красны между этими звездами белого/оранжевого цвета.
Начальный алгоритм
B-V до Кельвина
var t = 4600 * ((1 / ((0.92 * bv) + 1.7)) +(1 / ((0.92 * bv) + 0.62)) );
Кельвины к xyY
Если вы моделируете звезду как черное тело, то вы можете использовать численное приближение Planckian locus для вычисления координат xy (CIE цветность)
// t to xyY
var x, y = 0;
if (t>=1667 && t<=4000) {
x = ((-0.2661239 * Math.pow(10,9)) / Math.pow(t,3)) + ((-0.2343580 * Math.pow(10,6)) / Math.pow(t,2)) + ((0.8776956 * Math.pow(10,3)) / t) + 0.179910;
} else if (t > 4000 && t <= 25000) {
x = ((-3.0258469 * Math.pow(10,9)) / Math.pow(t,3)) + ((2.1070379 * Math.pow(10,6)) / Math.pow(t,2)) + ((0.2226347 * Math.pow(10,3)) / t) + 0.240390;
}
if (t >= 1667 && t <= 2222) {
y = -1.1063814 * Math.pow(x,3) - 1.34811020 * Math.pow(x,2) + 2.18555832 * x - 0.20219683;
} else if (t > 2222 && t <= 4000) {
y = -0.9549476 * Math.pow(x,3) - 1.37418593 * Math.pow(x,2) + 2.09137015 * x - 0.16748867;
} else if (t > 4000 && t <= 25000) {
y = 3.0817580 * Math.pow(x,3) - 5.87338670 * Math.pow(x,2) + 3.75112997 * x - 0.37001483;
}
xyY в XYZ (Y = 1)
// xyY to XYZ, Y = 1
var Y = (y == 0)? 0 : 1;
var X = (y == 0)? 0 : (x * Y) / y;
var Z = (y == 0)? 0 : ((1 - x - y) * Y) / y;
XYZ to RGB
var r = 0.41847 * X - 0.15866 * Y - 0.082835 * Z;
var g = -0.091169 * X + 0.25243 * Y + 0.015708 * Z;
var b = 0.00092090 * X - 0.0025498 * Y + 0.17860 * Z;
Вопрос
Я запустил этот алгоритм с индексами цвета B-V: 1.2, 1.0, 0.59, 0.0, -0.29. Это то, что я получил как результат.
Почему я получил этот странный результат? Горячие звезды голубоватые, но холодные звезды буроватые, и, похоже, не белые/оранжевые промежуточные звезды.
Update
Следуя комментарию Ozan, мне показалось, что я использовал неправильную матрицу для преобразования XYZ в RGB. Поскольку sRGB - это цветное пространство по умолчанию в Интернете (или оно?), Теперь я использую правильную матрицу, за которой следует функция гамма-коррекции (a = 0.055
).
Теперь я получаю эту красивую рампу,
но на концах все еще нет красного/фиолетового.
Demo
Там также есть fiddle, с которым вы можете играть.
Обновление 2
Если вы используете гамма 0,5 и расширяете диапазон цветовых индексов B-V от 4,7 до -0,5, я получаю красный цвет с одной стороны, но до сих пор не фиолетовый. Здесь обновлен fiddle.
<Т411 >