星の B-Vカラーインデックス を見かけのRGBカラーに変換しようとしています。ルックアップテーブルとカラーランプ以外に、これを行うためのよく知られたアルゴリズムがないようです。
これは、天文学者がその見かけの色を示すために星に割り当てる数です。ホットスター(低B-V)は青/紫で、クールスター(高B-V)は赤で、その間に白/オレンジの星があります。
var t = 4600 * ((1 / ((0.92 * bv) + 1.7)) +(1 / ((0.92 * bv) + 0.62)) );
星を黒体としてモデル化する場合は、 プランク軌跡 の数値近似を使用して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 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;
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)で実行しました。これは私が出力として得たものです。
なぜこの奇妙な出力が得られたのですか?熱い星は青みがかっていますが、冷たい星は茶色がかっていて、白/オレンジの中間星はないようです。
Ozan のコメントに続いて、XYZをRGBに変換するために間違った行列を使用していたようです。 sRGBはWebのデフォルトの色空間であるため(またはそうですか?)、現在、正しい行列とそれに続くガンマ補正関数(a = 0.055
)。
私は今、この素敵なカラーランプを手に入れました、
しかし、四肢にはまだ赤/紫はありません。
fiddle もあります。
0.5のガンマを使用し、B-Vカラーインデックスの範囲を4.7から-0.5に拡張すると、極端な場合は赤になりますが、バイオレットは表示されません。これが更新された フィドル です。
代わりにテーブル補間を使用します。数年前、私はこのテーブルをどこかで見つけました。
type r g b rrggbb B-V
O5(V) 155 176 255 #9bb0ff -0.32 blue
O6(V) 162 184 255 #a2b8ff
O7(V) 157 177 255 #9db1ff
O8(V) 157 177 255 #9db1ff
O9(V) 154 178 255 #9ab2ff
O9.5(V) 164 186 255 #a4baff
B0(V) 156 178 255 #9cb2ff
B0.5(V) 167 188 255 #a7bcff
B1(V) 160 182 255 #a0b6ff
B2(V) 160 180 255 #a0b4ff
B3(V) 165 185 255 #a5b9ff
B4(V) 164 184 255 #a4b8ff
B5(V) 170 191 255 #aabfff
B6(V) 172 189 255 #acbdff
B7(V) 173 191 255 #adbfff
B8(V) 177 195 255 #b1c3ff
B9(V) 181 198 255 #b5c6ff
A0(V) 185 201 255 #b9c9ff 0.00 White
A1(V) 181 199 255 #b5c7ff
A2(V) 187 203 255 #bbcbff
A3(V) 191 207 255 #bfcfff
A5(V) 202 215 255 #cad7ff
A6(V) 199 212 255 #c7d4ff
A7(V) 200 213 255 #c8d5ff
A8(V) 213 222 255 #d5deff
A9(V) 219 224 255 #dbe0ff
F0(V) 224 229 255 #e0e5ff 0.31 yellowish
F2(V) 236 239 255 #ecefff
F4(V) 224 226 255 #e0e2ff
F5(V) 248 247 255 #f8f7ff
F6(V) 244 241 255 #f4f1ff
F7(V) 246 243 255 #f6f3ff 0.50
F8(V) 255 247 252 #fff7fc
F9(V) 255 247 252 #fff7fc
G0(V) 255 248 252 #fff8fc 0.59 Yellow
G1(V) 255 247 248 #fff7f8
G2(V) 255 245 242 #fff5f2
G4(V) 255 241 229 #fff1e5
G5(V) 255 244 234 #fff4ea
G6(V) 255 244 235 #fff4eb
G7(V) 255 244 235 #fff4eb
G8(V) 255 237 222 #ffedde
G9(V) 255 239 221 #ffefdd
K0(V) 255 238 221 #ffeedd 0.82 Orange
K1(V) 255 224 188 #ffe0bc
K2(V) 255 227 196 #ffe3c4
K3(V) 255 222 195 #ffdec3
K4(V) 255 216 181 #ffd8b5
K5(V) 255 210 161 #ffd2a1
K7(V) 255 199 142 #ffc78e
K8(V) 255 209 174 #ffd1ae
M0(V) 255 195 139 #ffc38b 1.41 red
M1(V) 255 204 142 #ffcc8e
M2(V) 255 196 131 #ffc483
M3(V) 255 206 129 #ffce81
M4(V) 255 201 127 #ffc97f
M5(V) 255 204 111 #ffcc6f
M6(V) 255 195 112 #ffc370
M8(V) 255 198 109 #ffc66d 2.00
[edit1]偶然に出くわした this (前に述べた元の情報)
[edit2]これはXYZのものを含まない私の概算です
したがって、BVインデックスは< -0.4 , 2.0 >
からのものです
これが変換用の私の(C++)コードです:
//---------------------------------------------------------------------------
void bv2rgb(double &r,double &g,double &b,double bv) // RGB <0,1> <- BV <-0.4,+2.0> [-]
{
double t; r=0.0; g=0.0; b=0.0; if (bv<-0.4) bv=-0.4; if (bv> 2.0) bv= 2.0;
if ((bv>=-0.40)&&(bv<0.00)) { t=(bv+0.40)/(0.00+0.40); r=0.61+(0.11*t)+(0.1*t*t); }
else if ((bv>= 0.00)&&(bv<0.40)) { t=(bv-0.00)/(0.40-0.00); r=0.83+(0.17*t) ; }
else if ((bv>= 0.40)&&(bv<2.10)) { t=(bv-0.40)/(2.10-0.40); r=1.00 ; }
if ((bv>=-0.40)&&(bv<0.00)) { t=(bv+0.40)/(0.00+0.40); g=0.70+(0.07*t)+(0.1*t*t); }
else if ((bv>= 0.00)&&(bv<0.40)) { t=(bv-0.00)/(0.40-0.00); g=0.87+(0.11*t) ; }
else if ((bv>= 0.40)&&(bv<1.60)) { t=(bv-0.40)/(1.60-0.40); g=0.98-(0.16*t) ; }
else if ((bv>= 1.60)&&(bv<2.00)) { t=(bv-1.60)/(2.00-1.60); g=0.82 -(0.5*t*t); }
if ((bv>=-0.40)&&(bv<0.40)) { t=(bv+0.40)/(0.40+0.40); b=1.00 ; }
else if ((bv>= 0.40)&&(bv<1.50)) { t=(bv-0.40)/(1.50-0.40); b=1.00-(0.47*t)+(0.1*t*t); }
else if ((bv>= 1.50)&&(bv<1.94)) { t=(bv-1.50)/(1.94-1.50); b=0.63 -(0.6*t*t); }
}
//---------------------------------------------------------------------------
[メモ]
このBVカラーは、定義された温度照明の黒体であるため、これは、星に対して相対的な空間から見た星の色を表します。 視覚的に正しい色を得るには、大気の大気散乱効果と、速く刈る星のドップラー効果を追加する必要があります!!!たとえば、太陽は「白」ですしかし、光散乱後、色は赤(地平線近く)から黄色(最下点近く...正午)まで変化します
色を視覚的に修正したい場合は、これらの[〜#〜] qa [〜#〜]が役立つ場合があります。
PygletとMongoDBを使用してPython3.5で HYGデータベース からデータをレンダリングしているときにこのトピックを調査しました。星図で自分の星がどのように見えるかに満足しています。色はこの回答の下部にあります。
これは、 HYGデータベース のB-V(ci)データで使用した関数です。この例では、ciは実行中のリストのB-V値です。
temp = 4600 * (1 / (0.92 * ci + 1.7) + 1 / (0.92 * ci + 0.62))
私は これ を取りました、そして私はあなたもそうすることを提案します。温度列とRGBまたはrgb値列を参照として選択します
Rgbテーブルデータから、3つの順序付きリスト(n = 391)を生成しました(私の方法:スプレッドシートソフトウェアと一度に数百万のカーソルを持つことができるテキストエディターを使用したクリーンアップと選択、次に結果のコンマ区切りファイルをmongoDBでインポートしましたそのため、スクリプトファイルを乱雑にすることなく、pymongoラッパーを介してpythonの値のリストを簡単に操作できます)。レイアウトするメソッドの利点は、次のことができることです。 CMYKまたはHSVを使用する可能性のある他のテーブルからカラーデータを取得し、それに応じて適応します。相互参照することもできます。ただし、私が提案した(s)RGBテーブルから次のようなリストになるはずです。
reds = [255, 255, ... , 155, 155]
greens = [56, 71, ..., 188,188]
blues = [0, 0, ..., 255, 255]
""" this temps list is also (n=391) and corresponds to the table values."""
temps = []
for i in range(1000,40100,100):
temps.append(i)
この後、これらのリストにいくつかのガウス平滑化を適用しました(変動がなくなるため、より良い多項式を取得するのに役立ちます)、その後polyfit()numpyパッケージからR、G、B値に関する温度値へのメソッド(多項式回帰):
colors = [reds,greens,blues]
""" you can Tweak the degree value to see if you can get better coeffs. """
def smoothListGaussian2(myarray, degree=3):
myarray = np.pad(myarray, (degree-1,degree-1), mode='Edge')
window=degree*2-1
weight=np.arange(-degree+1, degree)/window
weight = np.exp(-(16*weight**2))
weight /= sum(weight)
smoothed = np.convolve(myarray, weight, mode='valid')
return smoothed
i=0
for color in colors:
color = smoothListGaussian2(color)
x = np.array(temps)
y = np.array(color)
names = ["reds","greens","blues"]
""" raise/lower the k value (third one) in c """
z = np.polyfit(x, y, 20)
f = np.poly1d(z)
#plt.plot(x,f(x),str(names[i][0]+"-"))
print("%sPoly = " % names[i], z)
i += 1
plt.show()
これにより、次の形式の多項式の(n)係数(a)が得られます。
今考えてみると、おそらくpolyfitを使用して、CIをRGBに直接変換する係数を考え出すことができます...そしてCIから温度への変換ステップをスキップしますが、最初に温度に変換すると、温度と選択した色空間の関係がより明確になります。
前に述べたように、他のスペクトルデータや他の色空間を使用して多項式曲線を適合させることができますが、この手順は同じです(わずかな変更があります)
とにかく、これが私が使用した完全な単純なコードです(また、これはk = 20の多項式です):
import numpy as np
redco = [ 1.62098281e-82, -5.03110845e-77, 6.66758278e-72, -4.71441850e-67, 1.66429493e-62, -1.50701672e-59, -2.42533006e-53, 8.42586475e-49, 7.94816523e-45, -1.68655179e-39, 7.25404556e-35, -1.85559350e-30, 3.23793430e-26, -4.00670131e-22, 3.53445102e-18, -2.19200432e-14, 9.27939743e-11, -2.56131914e-07, 4.29917840e-04, -3.88866019e-01, 3.97307766e+02]
greenco = [ 1.21775217e-82, -3.79265302e-77, 5.04300808e-72, -3.57741292e-67, 1.26763387e-62, -1.28724846e-59, -1.84618419e-53, 6.43113038e-49, 6.05135293e-45, -1.28642374e-39, 5.52273817e-35, -1.40682723e-30, 2.43659251e-26, -2.97762151e-22, 2.57295370e-18, -1.54137817e-14, 6.14141996e-11, -1.50922703e-07, 1.90667190e-04, -1.23973583e-02,-1.33464366e+01]
blueco = [ 2.17374683e-82, -6.82574350e-77, 9.17262316e-72, -6.60390151e-67, 2.40324203e-62, -5.77694976e-59, -3.42234361e-53, 1.26662864e-48, 8.75794575e-45, -2.45089758e-39, 1.10698770e-34, -2.95752654e-30, 5.41656027e-26, -7.10396545e-22, 6.74083578e-18, -4.59335728e-14, 2.20051751e-10, -7.14068799e-07, 1.46622559e-03, -1.60740964e+00, 6.85200095e+02]
redco = np.poly1d(redco)
greenco = np.poly1d(greenco)
blueco = np.poly1d(blueco)
def temp2rgb(temp):
red = redco(temp)
green = greenco(temp)
blue = blueco(temp)
if red > 255:
red = 255
Elif red < 0:
red = 0
if green > 255:
green = 255
Elif green < 0:
green = 0
if blue > 255:
blue = 255
Elif blue < 0:
blue = 0
color = (int(red),
int(green),
int(blue))
print(color)
return color
私の多項式からのOBAFGKM黒体温度スケール:
温度[0-40000K]でのRGB [0-255]のプロット、
ご覧のとおり、多少のずれはありますが、肉眼ではほとんど目立ちません。本当に改善したい場合は(私はしません)、他のいくつかのオプションがあります。
また、多項式の全体的なパフォーマンスにも満足しています。スターマップの最大120000個の星オブジェクトにそれぞれ最低18個の色付きの頂点をロードすると、数秒しかかからず、驚いたことになります。ただし、改善の余地はあります。より現実的なビュー(黒体放射で実行するのではなく)のために、重力レンズ、大気効果、相対論的ドップラーなどを追加できます...
ああ、そして [〜#〜]紫[〜#〜] 、約束通り。
その他の便利なリンク:
他の誰かが@Spektreの便利なC++をPythonに変換する必要がある場合に備えて。重複の一部(コンパイラーは間違いなく修正したはずです)と、bv>=2.0
の場合のgと1.94<bv<1.9509
の場合のbの不連続性を取り除きました。
def bv2rgb(bv):
if bv < -0.4: bv = -0.4
if bv > 2.0: bv = 2.0
if bv >= -0.40 and bv < 0.00:
t = (bv + 0.40) / (0.00 + 0.40)
r = 0.61 + 0.11 * t + 0.1 * t * t
g = 0.70 + 0.07 * t + 0.1 * t * t
b = 1.0
Elif bv >= 0.00 and bv < 0.40:
t = (bv - 0.00) / (0.40 - 0.00)
r = 0.83 + (0.17 * t)
g = 0.87 + (0.11 * t)
b = 1.0
Elif bv >= 0.40 and bv < 1.60:
t = (bv - 0.40) / (1.60 - 0.40)
r = 1.0
g = 0.98 - 0.16 * t
else:
t = (bv - 1.60) / (2.00 - 1.60)
r = 1.0
g = 0.82 - 0.5 * t * t
if bv >= 0.40 and bv < 1.50:
t = (bv - 0.40) / (1.50 - 0.40)
b = 1.00 - 0.47 * t + 0.1 * t * t
Elif bv >= 1.50 and bv < 1.951:
t = (bv - 1.50) / (1.94 - 1.50)
b = 0.63 - 0.6 * t * t
else:
b = 0.0
return (r, g, b)
私には機能しなかった@paddygのコードの修正として(特にbv <0.4の色の場合):これは@SpektreのC++コードのまったく同じバージョンですPython =:
def bv2rgb(bv):
if bv < -0.40: bv = -0.40
if bv > 2.00: bv = 2.00
r = 0.0
g = 0.0
b = 0.0
if -0.40 <= bv<0.00:
t=(bv+0.40)/(0.00+0.40)
r=0.61+(0.11*t)+(0.1*t*t)
Elif 0.00 <= bv<0.40:
t=(bv-0.00)/(0.40-0.00)
r=0.83+(0.17*t)
Elif 0.40 <= bv<2.10:
t=(bv-0.40)/(2.10-0.40)
r=1.00
if -0.40 <= bv<0.00:
t=(bv+0.40)/(0.00+0.40)
g=0.70+(0.07*t)+(0.1*t*t)
Elif 0.00 <= bv<0.40:
t=(bv-0.00)/(0.40-0.00)
g=0.87+(0.11*t)
Elif 0.40 <= bv<1.60:
t=(bv-0.40)/(1.60-0.40)
g=0.98-(0.16*t)
Elif 1.60 <= bv<2.00:
t=(bv-1.60)/(2.00-1.60)
g=0.82-(0.5*t*t)
if -0.40 <= bv<0.40:
t=(bv+0.40)/(0.40+0.40)
b=1.00
Elif 0.40 <= bv<1.50:
t=(bv-0.40)/(1.50-0.40)
b=1.00-(0.47*t)+(0.1*t*t)
Elif 1.50 <= bv<1.94:
t=(bv-1.50)/(1.94-1.50)
b=0.63-(0.6*t*t)
return (r, g, b)
@Spektreの答えSwift 3.0:
private func bv2ToRGB(for bv: CGFloat, logging: Bool = false) -> Color {
var bv = bv
var t: CGFloat = 0
var r: CGFloat = 0
var g: CGFloat = 0
var b: CGFloat = 0
if bv < -0.4 { bv = -0.4}
if bv > 2.0 { bv = 2.0}
switch bv {
case -0.4 ... 0.0:
t = (bv+0.40)/(0.00+0.40)
r = 0.61+(0.11*t)+(0.1*t*t)
case 0.0 ... 0.4:
t = (bv-0.00)/(0.40-0.00)
r = 0.83+(0.17*t)
case 0.4 ... 2.1:
t = (bv-0.40)/(2.10-0.40)
r = 1.00
default: break
}
switch bv {
case -0.4 ... 0.0:
t = (bv+0.40)/(0.00+0.40)
g = 0.70 + (0.07*t)+(0.1*t*t)
case 0.0 ... 0.4:
t = (bv-0.00)/(0.40-0.00)
g = 0.87 + (0.11*t)
case 0.4 ... 1.6:
t = (bv-0.40)/(1.60-0.40)
g = 0.98 - (0.16*t)
case 1.6 ... 2.0:
t = (bv-1.60)/(2.00-1.60)
g = 0.82 - (0.5*t*t)
default: break
}
switch bv {
case -0.4 ... 0.4:
t = (bv+0.40)/(0.40+0.40)
b = 1.0
case 0.4 ... 1.5:
t = (bv-0.40)/(1.50-0.40)
b = 1.00 - (0.47*t)+(0.1*t*t)
case 1.5 ... 1.94:
t = (bv-1.50)/(1.94-1.50)
b = 0.63 - (0.6*t*t)
default: break
}
#if os(OSX)
return NSColor(calibratedRed: r, green: g, blue: b, alpha: 1.0)
#else
return UIColor(red: r, green: g, blue: b, alpha: 1.0)
#endif
}
なぜバイオレットやディープブルーがないのですか?無限の色温度は、大気によって青みが少なくなる前は、1931年のCIE座標がX = .240、y = .234です。
無限の色温度での黒体のスペクトルは、帯域幅の単位波長あたりのパワーで、波長の4乗に反比例するスペクトルパワー分布を持っています。 700nmでは、これは400nmの10.7%です。
また、リスト( http://www.vendian.org/mncharity/dir3/blackbody/UnstableURLs/bbr_color.html )に基づいて、次の関数はkotlinを使用して、に基づいて温度の色を取得します。 2度スケール:
fun getColorForTemp(temp: Int) = when (temp) {
in 0..1000 -> -52480
in 1000..1100 -> -52480
in 1100..1200 -> -47872
in 1200..1300 -> -44544
in 1300..1400 -> -41728
in 1400..1500 -> -39424
in 1500..1600 -> -37120
in 1600..1700 -> -35328
in 1700..1800 -> -33792
in 1800..1900 -> -32256
in 1900..2000 -> -30976
in 2000..2100 -> -29429
in 2100..2200 -> -28131
in 2200..2300 -> -26583
in 2300..2400 -> -25293
in 2400..2500 -> -24004
in 2500..2600 -> -22971
in 2600..2700 -> -21939
in 2700..2800 -> -20908
in 2800..2900 -> -19877
in 2900..3000 -> -18846
in 3000..3100 -> -18071
in 3100..3200 -> -17041
in 3200..3300 -> -16266
in 3300..3400 -> -15492
in 3400..3500 -> -14718
in 3500..3600 -> -13945
in 3600..3700 -> -13427
in 3700..3800 -> -12654
in 3800..3900 -> -12137
in 3900..4000 -> -11364
in 4000..4100 -> -10847
in 4100..4200 -> -10330
in 4200..4300 -> -9813
in 4300..4400 -> -9297
in 4400..4500 -> -8780
in 4500..4600 -> -8264
in 4600..4700 -> -7748
in 4700..4800 -> -7488
in 4800..4900 -> -6972
in 4900..5000 -> -6712
in 5000..5100 -> -6196
in 5100..5200 -> -5936
in 5200..5300 -> -5421
in 5300..5400 -> -5161
in 5400..5500 -> -4646
in 5500..5600 -> -4386
in 5600..5700 -> -4127
in 5700..5800 -> -3868
in 5800..5900 -> -3609
in 5900..6000 -> -3094
in 6000..6100 -> -2835
in 6100..6200 -> -2576
in 6200..6300 -> -2317
in 6300..6400 -> -2059
in 6400..6500 -> -1800
in 6500..6600 -> -1541
in 6600..6700 -> -1539
in 6700..6800 -> -66817
in 6800..6900 -> -198401
in 6900..7000 -> -329729
in 7000..7100 -> -526849
in 7100..7200 -> -658177
in 7200..7300 -> -789505
in 7300..7400 -> -921089
in 7400..7500 -> -1052417
in 7500..7600 -> -1118209
in 7600..7700 -> -1249537
in 7700..7800 -> -1380865
in 7800..7900 -> -1446657
in 7900..8000 -> -1578241
in 8000..8100 -> -1709569
in 8100..8200 -> -1775105
in 8200..8300 -> -1840897
in 8300..8400 -> -1972225
in 8400..8500 -> -2038017
in 8500..8600 -> -2103809
in 8600..8700 -> -2235137
in 8700..8800 -> -2300929
in 8800..8900 -> -2366721
in 8900..9000 -> -2432257
in 9000..9100 -> -2498049
in 9100..9200 -> -2563841
in 9200..9300 -> -2629633
in 9300..9400 -> -2695169
in 9400..9500 -> -2760961
in 9500..9600 -> -2826753
in 9600..9700 -> -2892289
in 9700..9800 -> -2958081
in 9800..9900 -> -3023617
in 9900..10000 -> -3089409
in 10000..10200 -> -3155201
in 10200..10300 -> -3220993
in 10300..10400 -> -3286529
in 10400..10600 -> -3352321
in 10600..10700 -> -3418113
in 10700..10800 -> -3483649
in 10800..10900 -> -3483905
in 10900..11000 -> -3549441
in 11000..11200 -> -3615233
in 11200..11300 -> -3681025
in 11300..11500 -> -3746561
in 11500..11700 -> -3812353
in 11700..11900 -> -3878145
in 11900..12000 -> -3943681
in 12000..12100 -> -3943937
in 12100..12200 -> -4009473
in 12200..12300 -> -4009729
in 12300..12500 -> -4075265
in 12500..12700 -> -4141057
in 12700..12800 -> -4206593
in 12800..12900 -> -4206849
in 12900..13200 -> -4272385
in 13200..13400 -> -4338177
in 13400..13500 -> -4403713
in 13500..13700 -> -4403969
in 13700..13900 -> -4469505
in 13900..14000 -> -4469761
in 14000..14300 -> -4535297
in 14300..14600 -> -4601089
in 14600..14700 -> -4666625
in 14700..15000 -> -4666881
in 15000..15200 -> -4732417
in 15200..15300 -> -4732673
in 15300..15700 -> -4798209
in 15700..16100 -> -4864001
in 16100..16200 -> -4929537
in 16200..16500 -> -4929793
in 16500..16800 -> -4995329
in 16800..17000 -> -4995585
in 17000..17400 -> -5061121
in 17400..17500 -> -5061377
in 17500..18000 -> -5126913
in 18000..18100 -> -5192449
in 18100..18600 -> -5192705
in 18600..18800 -> -5258241
in 18800..19200 -> -5258497
in 19200..19700 -> -5324033
in 19700..19900 -> -5324289
in 19900..20600 -> -5389825
in 20600..20700 -> -5390081
in 20700..21500 -> -5455617
in 21500..21700 -> -5521153
in 21700..22400 -> -5521409
in 22400..22800 -> -5586945
in 22800..23400 -> -5587201
in 23400..24200 -> -5652737
in 24200..24500 -> -5652993
in 24500..25700 -> -5718529
in 25700..27100 -> -5784321
in 27100..27400 -> -5849857
in 27400..28700 -> -5850113
in 28700..29500 -> -5915649
in 29500..30600 -> -5915905
in 30600..32000 -> -5981441
in 32000..32700 -> -5981697
in 32700..35000 -> -6047233
in 35000..35200 -> -6047489
in 35200..38300 -> -6113025
in 38300..38600 -> -6178561
in 38600..40000 -> -6178817
else -> -6178817
}
なぜバイオレットがないのかという質問に答えて? :答えは、星はその色ではないということだと思います。むしろ、写真を撮るときにその色にレンダリングされません。さまざまな温度/ B-V値に対してこのスレッドで生成される色は、私にはかなり正確に見えます。私がシグナスでアルビレオを撮ったこの写真を撮ってください: https://www.flickr.com/photos/30974264@N02/6939409750/in/photolist-bB54th-bzdhKG アルビレオA(左)はKですBVが1.074のタイプの星で、アルビレオB(右)はBVが-0.06のBタイプの星です。これらのB-V値について上記のチャートの色を見ると、画像とかなり強い相関関係があると思います。また、非常に熱い星であっても、より長い波長でいくらかの出力があり、「青み」を彩度を下げる傾向があることを忘れないでください。黒体放射は広域スペクトルです。