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 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
| //////////////////////////////////////////////////////////////////////
////////////////////////////////// WIWAXIA ///////////////////////////
//////////////////////////////////////////////////////////////////////
// Fonction Coefficient couleur dépendant du paramètre G.
// Il s'agit en fait d'un facteur de correction non linéaire Fcnl(g, w).
FUNCTION CcG(G1, W1: Real): Real; inline;
VAR p, q: Real;
BEGIN
p:= (G1 - 1) * W1;
q:= 1 + p;
p:= G1 * W1;
CcG:= p / q
END;
FUNCTION iCoef_C(Pil: byte; t: Real): real; inline;
VAR u, w, g: Real;
BEGIN
g := 40;//2.5;//40;//0.0256;// , 0.064 , 0.16 , 0.4 , 2.5 , 6 , 16 , 40 -- g à 0 = image noire
{ IF t>1 THEN u:= t - 2 // décalage d'une période vers la gauche
ELSE IF t<-1 THEN u:= t + 2 // décalage d'une période vers la droite
ELSE u:= t;
// v:= Abs(u); w:= (3 * v) - 2; // old v1
//w := 2 - (3 * Abs(u));
w := (3 * Abs(u)) - 1;
// w := (3 * Abs(t)) - 1; // posts 15/11
IF w>1 THEN w:= 1 ELSE IF w<0 THEN w:= 0;
CASE Pil OF
0: iCoef_C:= w; // si w = 0.2 | 0.5 | 0.8
1: iCoef_C:= Sqr(w); // sqr = 0.04 | 0.25 | 0.64
2: iCoef_C:= Sqr(Sqr(w)); // sqr(sqr) = 0.001 | 0.06 | 0.41
3: begin u:= Sqrt(1 -w); iCoef_C:= Sqr(1 - u); end;
4: iCoef_C:= Sqrt(w); // sqrt = 0.4 | 0.7 | 0.9
5: begin u:= Sqr(1 - w); iCoef_C:= Sqrt(1 - u); end;
//9: iCoef_C:= g*w/(1 + (g-1)*w);
9: iCoef_C:= CcG(g, w);
ELSE iCoef_C:= Sqrt(w);
END; }
IF Odd(Pil) THEN w:= (1/2) + cos(Pi * t)
ELSE w:= (1/2) - cos(Pi * t);
IF w>1 THEN w:= 1
ELSE IF w<0 THEN w:= 0;
iCoef_C:= CcG(g, w)
END;
procedure wiwaxia(Pilote: byte; dst: TBitmap);
CONST
Lim = 5000.0; // finesse du dessin des graphiques : 500 = grossier, 5000 = origine, 50000 = peut-être trop
Rapport = 2 / 3;
offset = 20;
MaxByte = 255;
Cro: Pixel = (MaxByte, 0, 0);
Cve: Pixel = (0, MaxByte, 0);
Cbl: Pixel = (0, 0, MaxByte);
Dim_Max = 1600;
TYPE
Pixel = ARRAY[1..3] OF Byte;
Tab_Pix = ARRAY[0..Dim_Max, 0..(Dim_Max div 2)] OF Pixel;
//Tab_Pix = ARRAY OF ARRAY OF Pixel; // double le temps d'exécution...
VAR
h,w : integer;
Haut_Image, Larg_Image, LargeurMoinsUn: LongInt;
ZoneAffGraphik, DemiHauteur: LongInt;
Matrix: Tab_Pix;
PixelNoir: Pixel;
Px: Pixel;
r: Real;
{$IFDEF WINDOWS}
ss,dd : pRGBTriple; // assumes pf24bit scanlines
{$ELSE}
ss,dd : pRGBQuad; // assumes pf24bit scanlines
{$ENDIF}
PROCEDURE CalcMat_Im02(Hauteur: LongInt; VAR Matrix: Tab_Pix); // dégradé
VAR
x, y: LongInt;
BEGIN
FOR x:= 0 TO LargeurMoinsUn DO begin
r:= ((2 * x)/LargeurMoinsUn)-1;// enlever le -1 décale vers la gauche de 1/2 largeur
Px[1]:= Round(MaxByte * iCoef_C(Pilote, r));
Px[2]:= Round(MaxByte * iCoef_C(Pilote, r - Rapport));
Px[3]:= Round(MaxByte * iCoef_C(Pilote, r + Rapport));
FOR y := (Hauteur div 2) TO Hauteur DO Matrix[x, Hauteur-y]:= Px;//de (Haut div 2) à 0
end; // Hauteur div 2 ET PAS DemiHauteur (trop grand)
END;
PROCEDURE CalcMat_Im01(Hauteur: LongInt; VAR Matrix: Tab_Pix); // graphique
VAR
x, y, k: LongInt;
fLarg_Image, fLargeurMoinsUn, Real_Inc, R0: float; // souvi
BEGIN
ZoneAffGraphik:= Hauteur - offset;
fLarg_Image := Larg_Image;
fLargeurMoinsUn := LargeurMoinsUn * 0.5;
Real_Inc := fLarg_Image / (2.0 * Lim) ;
// R0 := (-Lim -1) * Real_Inc ;
R0 := -Real_Inc ;
//mainform.memo1.Lines.Add(inttostr(round((2*Lim)-1)) +' '+inttostr(x) +' '+floattostr(R0)); exit;
FOR k:= round(-Lim) TO round(Lim-1) DO BEGIN // Lim = 5000
// FOR k:= 0 TO round(2*Lim-1) DO BEGIN // Lim = 5000
r:= k / Lim;
// //x:= Round(((r+1) * (Larg_Image-1)) / 2); // Inc(x); // position horizontale, si présent, 1re colonne moisie
// x:= Round(((r+1) * LargeurMoinsUn) / 2); // Inc(x); // position horizontale, si présent, 1re colonne moisie
R0 := R0 + Real_Inc;
x := round(R0 + 0.5);
// x:= round((r+1) * fLargeurMoinsUn); // essai moi -- Inc(x); // position horizontale, si présent, 1re colonne moisie
//mainform.memo1.Lines.Add(inttostr(k) +' '+inttostr(x) +' '+floattostr(R0));
// avec LargeurMoinsUn ne dépasse pas 1535
//mainform.memo1.Lines.Add(inttostr(x) +' '+floattostr(((r+1) * (Larg_Image-1)) / 2));
// 2 lignes essai tbc92
// For x := 0 to Larg_Image-1 do begin // Ainsi x varie de 0 à 1535 ... c'est à dire pointe directement sur l'indice de la colonne qu'on va traiter .
// r := (x/(LargeurMoinsUn) *2)-1; // Ainsi r varie entre -1 et 1 comme dans ta version , donc en principe rien à changer dans le reste du code.
y:= Round(DemiHauteur * iCoef_C(Pilote, r));
Matrix[x, ZoneAffGraphik - y]:= Cro;
y:= Round(DemiHauteur * iCoef_C(Pilote, r - Rapport));
Matrix[x, ZoneAffGraphik - y]:= Cve;
y:= Round(DemiHauteur * iCoef_C(Pilote, r + Rapport));
Matrix[x, ZoneAffGraphik - y]:= Cbl;
END
END;
begin
Larg_Image := dst.Width;
Haut_Image := dst.Height;
DemiHauteur:= Haut_Image div 2;
LargeurMoinsUn := Larg_Image-1; // pour Im02
// SetLength(Matrix, Larg_Image+1, Haut_Image); //+1 car x du graphique arrive à 1536... -- corrigé 14/11/2016
//PixelNoir[1]:=0; PixelNoir[2]:=0; PixelNoir[3]:=0; // noir
PixelNoir[1]:=128; PixelNoir[2]:=128; PixelNoir[3]:=128; // gris
for w := 0 to Larg_Image-1 do for h := 0 to Haut_Image-1 do Matrix[w,h] := PixelNoir;
CalcMAt_Im01(Haut_Image, Matrix); // graphique
CalcMAt_Im02(Haut_Image-(offset * 4), Matrix); // dégradé
with dst do begin
BeginUpdate();
for h := 0 to (Height - 1) do begin
{$IFDEF WINDOWS}
dd := pRGBTriple(RawImage.GetLineStart(h));
for w := 0 to (Width - 1) do
dd[w] := iRGBtoRGBTriple(Matrix[w,h][1], Matrix[w,h][2], Matrix[w,h][3]);
{$ELSE} // positions R G B
dd := pRGBQuad(RawImage.GetLineStart(h));
for w := 0 to (Width - 1) do
dd[w] := iRGBAtoRGBAQuad(Matrix[w,h][1], Matrix[w,h][2], Matrix[w,h][3], 255);// 255 = pas de transparence
{$ENDIF}
end;
EndUpdate();
end;
end; |
Partager