Add(InlineCode,8666069,350,294) { @Hint=#10:HSL >> RGB| WorkPoints=#9:doHSL2RGB| EventPoints=#6:outRGB| VarPoints=#1:R|1:G|1:B| DataPoints=#1:H|1:S|1:L| Code=#15:unit HiAsmUnit;|12:// Autor Tad|29:// Более оптимальный алгоритм|9:interface|0:|29:uses Windows,kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|17: rR,rG,rB:byte;|9: public|29: H, S, L, outRGB:THI_Event;|54: procedure doHSL2RGB(var Data:TData; index:word); |43: procedure R(var Data:TData; index:word);|43: procedure G(var Data:TData; index:word);|43: procedure B(var Data:TData; index:word);|4:end;|0:|14:implementation|0:|32:procedure THiAsmClass.doHSL2RGB;|44:function Hue_2_RGB(v1, v2, vH :double):byte;|16: var V:double; |5:begin|65: if vH < 0 then vH := vH + 1 else if vH > 1 then vH := vH - 1;|58: if 6 * vH < 1 then V := v1 + ( v2 - v1 ) * vH * 6 |36: else if 2*vH < 1 then V := v2 |78: else if 3*vH < 2 then V := v1 + ( v2 - v1 ) * ( 0.6666666 - vH ) * 6 |23: else V := v1; |27: result := Round(255*V);|4:end;|0:|40:var rH, rS, rL, var1, var2, Temp:double;|5:begin|61:rS := toIntegerEvent(S); // читаем насыщенность как есть|114:rL := toIntegerEvent(L)/240; // читаем яркость и т.к. параметр используется в любом случае, то сразу делим на 240|69:if ( rS = 0 ) then // если насышенность = 0, то |9: begin|116: rR := Round(rL*255); // вычисляем значение КРАСНОГО и т.к. Зелёный и синий вычисляются по той же |100: rG := rR; // формуле и с теми же данными, то чтобы не делать лишних вычислений, |83: rB := rR; // применяем простое присваивание. (ускорение работы)|7: end|69:else // если насыщенность не равна нулю, то|9: begin|68: rS := rS/240; //приводим rS в нужный формат и|66: rH := toIntegerEvent(H)/240; //считываем значение оттенка |73: if rL < 0.5 then var2 := rL*(1+rS) else var2 := (rL+rS)-( rL*rS);|34: var1 := 2 * rL - var2; |86: Temp := rH + 0.3333333; // вместо вычисления 1/3 подставляем готовое 0.3333333|46: rR := Hue_2_RGB( var1, var2, Temp ); |42: rG := Hue_2_RGB( var1, var2, rH );|86: Temp := rH - 0.3333333; // вместо вычисления 1/3 подставляем готовое 0.3333333|48: rB := Hue_2_RGB( var1, var2, Temp ); |8: end;|8: |46: _hi_OnEvent(outRGB, RGB(rR,rG,rB)); |4:end;|0:|14://нижние точки|52:procedure THiAsmClass.R(var Data:TData; index:word);|5:begin|22: dtInteger(Data, rR);|4:end;|0:|52:procedure THiAsmClass.G(var Data:TData; index:word);|5:begin|22: dtInteger(Data, rG);|4:end;|0:|52:procedure THiAsmClass.B(var Data:TData; index:word);|5:begin|22: dtInteger(Data, rB);|4:end;|0:|0:|4:end.| AddHint(-41,-33,77,13,@Hint) }