1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
| procedure wiwaxia(Pilote: byte; dst: TBitmap);
CONST Dim_Max = 2000;
TYPE Pixel = ARRAY[1..3] OF Byte;
Tab_Pix = ARRAY[1..Dim_Max, 1..(Dim_Max div 2)] OF Pixel;
Z_32 = LongInt;
VAR Haut_Image, Larg_Image: Z_32; // Z_32 = LongInt
Matr_Image: Tab_Pix;
{Pilote: Byte;} g: Real;
hh,ww : integer;
PixelNoir: Pixel;
{$IFDEF WINDOWS}
ss,dd : pRGBTriple; // assumes pf24bit scanlines
{$ELSE}
ss,dd : pRGBQuad; // assumes pf24bit scanlines
{$ENDIF}
FUNCTION locCoef_C(Pil: Byte; t: Real): Real;
VAR u, v, w, g: Real;
FUNCTION CcG(G1, W1: Real): Real;
VAR p, q: Real;
BEGIN
p:= (G1 - 1) * W1; q:= 1 + p;
p:= G1 * W1; CcG:= p / q
END;
BEGIN
g := 40;//2.5;//40;//0.0256;// , 0.064 , 0.16 , 0.4 , 2.5 , 6 , 16 , 40
IF t>1 THEN u:= t - 2
ELSE IF t<-1 THEN u:= t + 2
ELSE u:= t;
v:= Abs(u); w:= 2 - (3 * v); IF w>1 THEN w:= 1
ELSE IF w<0 THEN w:= 0;
CASE Pil OF
0: locCoef_C:= w; // si w = 0.2 | 0.5 | 0.8
1: locCoef_C:= Sqr(w); // sqr = 0.04 | 0.25 | 0.64
2: locCoef_C:= Sqr(Sqr(w)); // sqr(sqr) = 0.001 | 0.06 | 0.41
3: begin u:= Sqrt(1 -w); locCoef_C:= Sqr(1 - u); end;
4: locCoef_C:= Sqrt(w); // sqrt = 0.4 | 0.7 | 0.9
5: begin u:= Sqr(1 - w); locCoef_C:= Sqrt(1 - u); end;
//9: locCoef_C:= CcG(g, w);
9: locCoef_C:= g*w/(1 + (g-1)*w);
ELSE locCoef_C:= Sqrt(w);
END;
END;
PROCEDURE CalcMat_Im02(La, Ha: Z_32; VAR Ma: Tab_Pix); // dégradé
CONST Lim = 5000; h = 2 / 3; m = 255;
VAR K1, H1, x, y: Z_32; r, s: Real; Px: Pixel;
BEGIN
H1:= Ha;// + 1; pourquoi +1 ?
K1:= Round(0.55 * Ha);
// optimisation : 26.6 millisec dessous -- 85.5 dessus !
FOR x:= 0 TO La-1 DO begin // mod, d'où suppr -1 dans (x - 1) dessous
// s:= (x - 1)/(La - 1); r:= (2 * s)-1; // original
// s:= x/(La - 1); r:= (2 * s) - 1;// supprimer -1 fin de ligne intervient sur la couleur
s:= x/(La - 1); r:= (2 * s);// - 1; pour dégragé RYGCBMR
// code d'origine, on démarre à magenta, rouge, vert au milieu
// s:= locCoef_C(Pilote, r + h); Px[1]:= Round(m * s);
// s:= locCoef_C(Pilote, r); Px[2]:= Round(m * s);
// s:= locCoef_C(Pilote, r - h); Px[3]:= Round(m * s);
// couleurs wiwaxia idem post 62 avec "-1 de fin de ligne" en service
// s:= locCoef_C(Pilote, r - h); Px[1]:= Round(m * s);
// s:= locCoef_C(Pilote, r); Px[2]:= Round(m * s);
// s:= locCoef_C(Pilote, r + h); Px[3]:= Round(m * s);
// dégradé RYGCBMR OK comme ça avec "-1 de fin de ligne" supprimé
s:= locCoef_C(Pilote, r); Px[1]:= Round(m * s);
s:= locCoef_C(Pilote, r - h); Px[2]:= Round(m * s);
s:= locCoef_C(Pilote, r + h); Px[3]:= Round(m * s);
FOR y:= K1 TO H1 DO // mod
Ma[x, H1 - y]:= Px;
end;
END;
PROCEDURE CalcMat_Im01(La, Ha: Z_32; VAR Ma: Tab_Pix); // graphiques
CONST Lim = 5000; h = 2 / 3; m = 10;
Cro: Pixel = (255, 0, 0);
Cve: Pixel = (0, 255, 0);
Cbl: Pixel = (0, 0, 255);
VAR k, K1, H1, x, y: Z_32; r, s: Real;
BEGIN
H1:= Ha + 1; Dec(H1, m);
K1:= Round(0.45 * Ha); Dec(K1);
FOR k:= -Lim TO Lim DO
BEGIN
r:= k / Lim; s:= (r + 1) * (La - 1);
x:= Round(s / 2); // Inc(x);
// dégradé wiwaxia
// s:= locCoef_C(Pilote, r); y:= Round(K1 * s); Ma[x, H1 - y]:= Cve;
// s:= locCoef_C(Pilote, r + h); y:= Round(K1 * s); Ma[x, H1 - y]:= Cbl;
// s:= locCoef_C(Pilote, r - h); y:= Round(K1 * s); Ma[x, H1 - y]:= Cro
// dégradé RYGCBMR
s:= locCoef_C(Pilote, r); y:= Round(K1 * s); Ma[x, ((H1+m) div 2) +y]:= Cro;
s:= locCoef_C(Pilote, r - h); y:= Round(K1 * s); Ma[x, ((H1+m) div 2) +y]:= Cve;
s:= locCoef_C(Pilote, r + h); y:= Round(K1 * s); Ma[x, ((H1+m) div 2) +y]:= Cbl;
// mais profils 3, 9 g=40 pas bon du tout...
END
END;
begin
Larg_Image := dst.Width;
Haut_Image := dst.Height;
// PixelNoir[1]:=0; PixelNoir[2]:=0; PixelNoir[3]:=0;
PixelNoir[1]:=128; PixelNoir[2]:=128; PixelNoir[3]:=128; // gris
for ww := 0 to Larg_Image-1 do for hh := 0 to Haut_Image-1 do Matr_Image[ww,hh] := PixelNoir;
CalcMAt_Im01(Larg_Image, Haut_Image, Matr_Image);
CalcMAt_Im02(Larg_Image, Haut_Image, Matr_Image);
with dst do begin
BeginUpdate();
for hh := 0 to (Height - 1) do
begin
{$IFDEF WINDOWS}
dd := pRGBTriple(RawImage.GetLineStart(hh));
{$ELSE}
dd := pRGBQuad(RawImage.GetLineStart(hh));
{$ENDIF}
for ww := 0 to (Width - 1) do begin
{$IFDEF WINDOWS}
dd[ww] := iRGBtoRGBTriple(Matr_Image[ww,hh][1], Matr_Image[ww,hh][2], Matr_Image[ww,hh][3]);
{$ELSE} // positions R G B
dd[ww] := iRGBAtoRGBAQuad(Matr_Image[ww,hh][1], Matr_Image[ww,hh][2], Matr_Image[ww,hh][3], 255);
{$ENDIF}
end;
end;
EndUpdate();
end;
end; |
Partager