Stern B-V-Farbindex zur sichtbaren RGB-Farbe

Ich versuche, einen Stern umzuwandelnB-V Farbindex zu einer scheinbaren RGB-Farbe. Abgesehen von Nachschlagetabellen und Farbverläufen scheint es keinen bekannten Algorithmus dafür zu geben.

Was ist ein B-V-Farbindex?

Es ist eine Zahl, die Astronomen einem Stern zuweisen, um seine scheinbare Farbe anzuzeigen. Heiße Sterne (niedriges B-V) sind blau / lila und kühle Sterne (hohes B-V) sind rot mit diesen weißen / orangefarbenen Sternen dazwischen.

AnfangsalgorithmusB-V nach Kelvin

var t = 4600 * ((1 / ((0.92 * bv) + 1.7)) +(1 / ((0.92 * bv) + 0.62)) );
Kelvin zu xyY

Wenn Sie einen Stern als schwarzen Körper modellieren, können Sie eine numerische Näherung derPlanck'scher Ort zur Berechnung der xy-Koordinaten (CIE-Farbart)

// 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 bis 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 zu 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;
Frage

Ich habe diesen Algorithmus mit den B-V-Farbindizes ausgeführt: 1.2, 1.0, 0.59, 0.0, -0.29. Das habe ich als Ausgabe bekommen.

Warum habe ich diese seltsame Ausgabe bekommen? Heiße Sterne sind bläulich, aber kalte Sterne sind bräunlich und es scheint keine weiß / orangefarbenen Zwischensterne zu geben.

Aktualisieren

Im Anschluss an einen Kommentar vonOzanEs schien, als würde ich eine falsche Matrix verwenden, um XYZ in RGB umzuwandeln. Da sRGB der Standardfarbraum im Web ist (oder?), Verwende ich jetzt die richtige Matrix, gefolgt von einer Gammakorrekturfunktion (a = 0.055).

Ich bekomme jetzt diese schöne Farbrampe,

aber es gibt immer noch kein Rot / Violett an den Extremitäten.

Demo

Es gibt auch einGeige jetzt, wo du mit spielen kannst.

Update 2

Wenn Sie ein Gamma von 0,5 verwenden und den Bereich der B-V-Farbindizes von 4,7 bis -0,5 erweitern, erhalte ich an einem Extrem Rot, aber immer noch kein Violett. Hier ist die aktualisierteGeige.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage