在Java中,根据计算出的整数将可见光谱映射到RGB(较高的整数应更接近紫外线,较低的整数应更接近红外线)

在Java中,根据计算出的整数将可见光谱映射到RGB(较高的整数应更接近紫外线,较低的整数应更接近红外线),java,colors,color-space,mandelbrot,color-mapping,Java,Colors,Color Space,Mandelbrot,Color Mapping,它用于Mandelbrot集渲染(请参见:);每个点的颜色应基于复数Z转义集合所需的迭代次数 我想映射颜色,这样如果点是Mandelbrot集合的一个元素,它应该是纯红色[RGB(255,0,0),从红外到紫外光谱的0%] 如果由于循环达到迭代上限而停止计算,则颜色应为纯紫色[RGB(249192255),100%跨光谱] 我认为解决方案包括如下内容: //where iterCount is the value for that point, maxIters is the iteration

它用于Mandelbrot集渲染(请参见:);每个点的颜色应基于复数Z转义集合所需的迭代次数

我想映射颜色,这样如果点是Mandelbrot集合的一个元素,它应该是纯红色[RGB(255,0,0),从红外到紫外光谱的0%]

如果由于循环达到迭代上限而停止计算,则颜色应为纯紫色[RGB(249192255),100%跨光谱]

我认为解决方案包括如下内容:

//where iterCount is the value for that point, maxIters is the iteration cap
double spectrumValue=iterCount/maxIters; //percent in decimal form
setColor(RGBConversion(spectrumValue));

但是,我不知道如何做的部分是RGBConversion方法。理想情况下,它应该在恒定的时间内运行。

你可以从代表光谱中关键点的一系列颜色开始:红色、橙色、黄色、绿色、蓝色、紫色。假设它们在0、0.2、0.4、0.6、0.8和1等间距。然后使用来平滑它们之间的过渡


对于每个间隔,您需要将增量范围(0.0到0.2)映射为0到1的比率。

您可以从表示光谱中关键点的颜色数组开始:红色、橙色、黄色、绿色、蓝色、紫色。假设它们在0、0.2、0.4、0.6、0.8和1等间距。然后使用来平滑它们之间的过渡


对于每个间隔,您需要将增量范围(0.0到0.2)映射为0到1的比率。

您应该考虑使用“HSL”或“HSB”(也称为“HSV”)颜色空间,其中两个颜色空间中的“H”代表“色调”。色调通常以度为单位测量角度,0度表示红色,120度表示绿色,240度表示蓝色,尽管有些库使用范围0..1

保持“S”和“B”不变,从范围底部到顶部线性变化“H”,将产生典型的“彩虹”颜色

在您的情况下,由于您使用的是Java和AWT,您应该能够简单地调用:

setColor(Color.getHSBColor(spectrumValue, 1.0, 1.0));

您应该考虑使用“HSL”或“HSB”(又名“HSV”)颜色空间,其中“H”代表“色调”。色调通常以度为单位测量角度,0度表示红色,120度表示绿色,240度表示蓝色,尽管有些库使用范围0..1

保持“S”和“B”不变,从范围底部到顶部线性变化“H”,将产生典型的“彩虹”颜色

在您的情况下,由于您使用的是Java和AWT,您应该能够简单地调用:

setColor(Color.getHSBColor(spectrumValue, 1.0, 1.0));

一个简单的
if
语句检查
iterCount
是否等于
maxIters
难道不给你机会指定两种不同的颜色吗?迭代梯度不是均匀的,它变得更陡,接近M集。因此,均匀的颜色渐变将显示很少的最大颜色像素,并且在构建<代码>数组[Max ITES] 时可以考虑。我的方法是创建一个渐变颜色的
数组[256]
,当索引为
数组[iterations%256]
时,它会平滑地包裹起来。但是也要考虑到M集附近的迭代是非常混乱的,你的单色梯度看起来比我的方法要好,我强迫相邻的像素有非常不同的迭代,是中灰色(M集本身是黑色的)。@肯尼是的,但是这只给了我2种颜色,然而,我需要在这两种颜色之间有一个渐变,包括数百种或数千种颜色。@WeatherVane你能更清楚地解释一下你的意思吗?我假设你的意思是将颜色存储在数组[256]中,但是A,我需要更多的颜色,B,索引“迭代%256”实现了什么?@mjones.udri我的意思是我的颜色包裹,因此如果迭代是256,颜色将来自
数组[0]
,颜色每256次迭代重复一次。我在256个数组中淡出蓝色->绿色(无红色),然后淡出绿色->红色(无蓝色),然后淡出红色->蓝色(无绿色),实际上我认为是255(3*85).一个简单的
if
语句检查
iterCount
是否等于
maxIters
难道不给你机会指定两种不同的颜色吗?迭代梯度不是均匀的,它变得更陡,接近M集。因此,均匀的颜色渐变将显示很少的最大颜色像素,并且在构建<代码>数组[Max ITES] 时可以考虑。我的方法是创建一个渐变颜色的
数组[256]
,当索引为
数组[iterations%256]
时,它会平滑地包裹起来。但是也要考虑到M集附近的迭代是非常混乱的,你的单色梯度看起来比我的方法要好,我强迫相邻的像素有非常不同的迭代,是中灰色(M集本身是黑色的)。@肯尼是的,但是这只给了我2种颜色,然而,我需要在这两种颜色之间有一个渐变,包括数百种或数千种颜色。@WeatherVane你能更清楚地解释一下你的意思吗?我假设你的意思是将颜色存储在数组[256]中,但是A,我需要更多的颜色,B,索引“迭代%256”实现了什么?@mjones.udri我的意思是我的颜色包裹,因此如果迭代是256,颜色将来自
数组[0]
,颜色每256次迭代重复一次。我在256个数组中淡出蓝色->绿色(无红色),然后淡出绿色->红色(无蓝色),然后淡出红色->蓝色(无绿色),实际上我认为是255个(3*85)。哦,好建议。这个答案看起来很有帮助:@bcholmes严格来说,你的答案也有同样的作用,但只适用于完全饱和的颜色。在你的方法中,重要的是要包括三级颜色(例如橙色),否则从红色到绿色的插值会遗漏这些颜色。我尝试了一个类似于@bcholmes发布的链接中的解决方案,但我得到的只是一个实心的红色正方形;我知道着色是个问题,因为我让程序用其他任意颜色贴图方案生成精确的渲染。@Alnitak是的,我使用的是Ja