我正在尝试将明星的B-V color index转换为明显的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 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可以让你玩了。
更新2
如果使用0.5的gamma,并将B-V颜色指数的范围从4.7扩展到-0.5,我会在一个极端得到红色,但仍然没有紫色。这是更新后的fiddle。
https://stackoverflow.com/questions/21977786
复制相似问题