how to supply linearly color(50分)

  • 主题发起人 主题发起人 leo_aj
  • 开始时间 开始时间
L

leo_aj

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在在做一段模拟线路, 给一段电线通电,观察温度变化。我用color to display
温度。so, 如何现实线性color. 温度越高color 越深。
note: i use timer to 模拟时间。so the 温度 is different in every 毫秒。
the color should change all the time until you disable the timer. thus, i just
worry about the color is not enough to display

looking forward you reply.
 
颜色不够显示么? 在帮助里看看"Tcolo"的解释.
 
sorry, forgot a question. i want to use Tchart to display tempture as well, how
do i do that.
i will add another 50 marks for this question
 
需要一个 RGB to HSB 的转换算法。
我们一般使用 RGB 三原色来合成色彩,但是要方便地得到线性颜色,需要控制颜色的色
度(H)、饱和度(S)和亮度(B),用 HSB 比较好。
这个算法我一时找不到,不过你可以打开 Windows 的颜色对话框,把调色板打开,上下
拉动亮度条,或左右移动十字标尺,可以大致观察到 RGB 和 HSB 的对应变化关系。
From: BaKuBaKu
 
常用的方法是采用 黑--蓝--绿--红--白 的变化表示温度分布。

即温度的相对零点为纯黑,相对峰值顶点为纯白,而各种中间色在上述序列中
分段线性插值。
如 在 0-100 度的情况下。 0 为黑色,20 为蓝黑,25 为纯蓝,35 为蓝绿,
50 为纯绿,65 为橙黄,75 为纯红,85 为高亮红,100 为纯白。

这种表示法很适应人的色彩感受,这个回答可以了吗?不会要具体函数吧?
简单的不必写。
 
能否给出连续色彩的生成算法?就像彩虹的渐变颜色条。
 
To BaKuBaKu:
HSB ==> RGB 中保持 B=120, S:=240; H 变化即可
 
我是要的 RGB ==> HSB 的算法。
换句话说就是:我怎样通过控制 RGB 的变化,达到自如地控制 HSB ?
比如:你说“保持 B=120, S:=240; H 变化即可”,我怎样变化 RGB ,才能让“H 变化即可”呢?
 
有没有搞错, h,s,b 已知,可得出r,g,b 换句话说,
通过 hsb->rgb 的转换,可以用 r,g,b 表示出 h,s,b
简单得就象 X=Y;然后有人说:
>>我要的是 X->Y 的算法 不是Y->X 的算法

另:hsb<->rgb 为阶段函数.
 
再问:能不能给出这样一个例子函数:
Procedure HSB2RGB(H,S,B: Integer; var R,G,B: Integer);
begin
R := ...;
G := ...;
B := ...;
end;
这样,我就可以随时得到 RGB 的值,比如你说的:“保持 B=120, S:=240; H 变化即可”,就可以这样做:
var R,G,B: Integer;
for i := 0 to 240 do
begin
HSB2RGB(I,240,120,R,G,B);
... // 得到 RGB 后就可以向屏幕输出颜色了
end;
谢谢。
 
How to use HSB, I can't find it in the help.
 
to Leo_aj &amp; BaKuBaKu:
Try this Function !
我使用了一个近似与 HSB 模型的 HSL色彩模型:
Type ColorHSLQuad=Record
Case Integer of
0:(DW:LongWord);
1:(H:Byte; //0-240
S:Byte; //0-240
L:Byte; //0-240
Reserved:Byte);
End;

ColorRGBA=Record
Case Integer of
0:(DW:LongWord);
1:(R:Byte;
G:Byte;
B:Byte;
A:Byte);
End;

Function HSL_To_RGB(HSL:LongWord):TColor;
Var m1,m2:Integer;
C:ColorRGBA;
CH:ColorHSLQuad;
Begin
CH.DW:=HSL;
IF CH.S=0 then
begin
C.R:=CH.L*51 div 48;
C.G:=C.R;
C.B:=C.R;
C.A:=0;
Result:=C.DW;Exit;
End else
Begin
if CH.L<=120 then m2:=(CH.L+CH.L*CH.S Div 240)*51 Div 48
else m2:=(CH.L+CH.S-(Ch.L*Ch.s) Div 240)*51 div 48;
m1:=(CH.L*51 div 24)-m2;
C.R:=VALUE(m1,m2,CH.H+80);
C.G:=VALUE(m1,m2,CH.H);
C.B:=VALUE(m1,m2,CH.H-80);
End;
C.A:=0;
Result:=C.DW;
End;

Function VALUE(n1,n2,hue:Integer):Byte; //分区域取值
Begin
if (hue>240) then Dec(Hue,240)
else if(hue<0) then Inc(Hue,240);
if (hue<40) then
Result:=((n1+(n2-n1)*hue div 40))
else if (hue<120) then
Result:=(n2)
else if (hue<160) then
Result:=((n1+(n2-n1)*(160-hue) div 40))
else Result:=(n1);
end;

Is this Clear ?
 
谢谢,研究一下。
 
能不能再给点解释,谢谢。
 
哪方面的解释,好象比较明白了。
好吧:
H,S,L 中 H 为色相 表示不同的色彩感受
S 为色饱和度 表示色彩的浓艳程度
L 为亮度 表示色彩的亮度
这是我们日常描述颜色时的自然模型
如:很"亮"的"纯""兰"色

R,G,B 是计算机中的表示颜色法,该模型便于计算机处理和显示
但不利于人的习惯,你能看到RGB值就能说出他的色彩吗?
要作到这一点需要有一定的色彩经验。

在你的问题中,需要用不同的颜色表示不同的温度。
那么,你所能测量到的温度一定是有范围的。
好,我们假设可得温度的最低值为 Tmin ,最高值为 TMax
按照色彩的给人的温度感觉。
从 黑-》蓝-》绿-》红-》白 是越来越热的。
因此,你可以在项目中把Tmin的颜色用黑色表示, Tmax 用白色表示。
而中间的色彩用上述颜色序列的插值表示,而RGB 模型不利于色彩的
连续表示。因为没有一个值可描述色彩的连续变化。就可以使用 HSL.
变化H 就能得到色彩的连续变化。 当然,在两端不需要变化 H ,
(从黑到蓝 把L从0-120 ,从红到白 ,把L从120-240, 中间保持L=120
S 始终为 240 )
最后用Hsl_RGB 的公式(见上)转为计算机使用的RGB 色彩,就行了。
没有问题拉吧,我的手都敲酸了




 
GGCAT 干得好。
 
hi GGCAT, that 's cool. you really did a god job.
 
leo_aj
该表示表示了吧,不旺我热心一场。
哎,没办法,受制于人啊。。。。

 
sorry, man. i thought i did it already.
 
后退
顶部