Цветовой индекс Star B-V до видимого цвета RGB

Я пытаюсь преобразовать звезду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

Если вы моделируете звезду как черное тело, то вы можете использовать числовое приближениеПланковский локус вычислить координаты 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 в 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. Это то, что я получил в качестве вывода.

Почему я получил этот странный вывод? Горячие звезды голубоватые, а холодные коричневатые, и промежуточных звезд белого / оранжевого цвета не существует.

Обновить

После комментарияОзанказалось, что я использовал неправильную матрицу для преобразования XYZ в RGB. Так как sRGB является цветовым пространством по умолчанию в сети (или это так?), Я сейчас использую правильную матрицу, за которой следует функция гамма-коррекции (a = 0.055).

Теперь я получаю эту красивую цветную рампу,

но все еще нет красного / фиолетового на конечностях.

демонстрация

Там также естьиграть на скрипке Теперь, когда вы можете играть с.

Обновление 2

Если использовать гамму 0,5 и расширить диапазон цветовых индексов B-V до уровня от 4,7 до -0,5, я получу красный в одном крайнем случае, но все равно не буду фиолетовым. Вот обновленныйиграть на скрипке.

Ответы на вопрос(8)

Ваш ответ на вопрос