做一个计算程序的可视化程序要用到的,需要用色彩表示数值的大小。
试过了很多RGB的组合,还是没有满意的效果,其实用Hue就可以了。不过最后给后处理程序的还是RBG的参数,就需要HSL和RGB之间的相互转换关系了。RGB如左图所示,XYZ为红绿蓝三色空间;右图则是HSL空间,HSL表示色调H、饱和度S和亮度L。
一般在有限元中,采用的表示应力、应变的方法就是采用在一定S/L参数下的Hue,根据数值的大小,在空间中一般只占有从0~240度,即从红到蓝的范围。如下图所示:
Max —————- Min
它们之间的转换公式可以参照 Wiki 上的介绍。“染色”工作已经完成……
PS: RGB=(red, green, blue); HSL=(hue, saturation, lightness)
附录子程序,从HSL到RGB转换。输入HSL参数得到的C[i]就是需要的RGB参数。
其中H~[0,240];S和L~[0,1]。
/*HSL to RGB space transformation. */
double C[3];
void HSL2RGB(double H, double S, double L)
{
double Q;
double P;
double T[3];
H=H*1.0*1/360;
T[0]=H+1.0*1/3;
T[1]=H;
T[2]=H-1.0*1/3;
int j;
for(j=0;j<3;j++)
{
if(T[j]<0) T[j]=T[j]+1.0;
if(T[j]>1) T[j]=T[j]-1.0;
}
if(L<0.5) Q=L*(1.0+S);
if(L>=0.5) Q=L+S-(L*S);
P=2.0*L-Q;
int k;
for(k=0;k<3;k++)
{
if(T[k]<1.0*1/6) C[k]=P+((Q-P)*6.0*T[k]);
if(T[k]<0.5 && T[k]>=1.0*1/6) C[k]=Q;
if(T[k]>=0.5 && T[k]<1.0*2/3) C[k]=P+((Q-P)*(1.0*2/3-T[k])*6.0);
if(T[k]>=1.0*2/3) C[k]=P;
}
}
发表回复