我需要在C#中将单个值转换为RGB以为单个点着色。这些值存储在列表中,一个值存储到一个点。
1)我知道列表中的最小值和最大值。
2)值的范围可以是任意值,例如:-13,20000,0.000234 ...
3)红色,绿色和蓝色值必须在范围< 0; 1>范围内。我使用glColor3f。
如何融合?
答案 0 :(得分:1)
没有规范的方法将单个1维值映射到3-dimensional space of colors。您基本上正在寻找一种从1维间隔生成3d曲线的自动方法。显然,有很多方法可以做到这一点。
评论者建议使用固定颜色的色度(如红色)并改变其亮度。虽然这可能是最简单的方法,但您显然不希望这样做。
另一种方法是将您的值映射到HSV Color Space,将实际值映射到hue并为饱和度和值选择一些固定值(从最大值开始并将其调低如果结果太亮了。)
因此算法可能如下:
获取最大和最小。
将min映射到色调的最小角度,比如10度,并将最大值映射到最大角度,比如说350度。 (您需要使用这些边界)。
对于列表中的每个值,
插值最大和最小色调之间的值:
var hue = minHue + (maxHue - minHue) * (value - min)/(max - min)
给定饱和度和值的固定值(比如每个开始为1.0),使用此答案中的代码将它们映射到RGB颜色空间:Is there a built-in C#/.NET System API for HSV to RGB?。
以上返回R,G和B的范围为0-255。根据您的要求将它们标准化为0到1之间。
如果您熟悉Paint.NET,它的颜色选择器工具允许您为S和V的给定值选择色调(H):
你做的基本上与从工具中挑选颜色一样。