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
|
FUNCTION IcFgrvb(Rg: Byte; Ng: Reel; Lc: Lst3R): Reel; // TYPE Reel = Extended;
CONST Cc: Lst3R = (0.2126, 0.7152, 0.0722);
Cc1: Lst3R = (4.7037, 1.3982, 13.850); // Cc1[k] = 1 / Cc[k]
Np1 = 2.2; Nm1 = 0.454545; // Nm1 = 1 / Np1
VAR i, j: Byte; p, q, r, s: Reel; Liste: Lst3R;
BEGIN
s:= Power(Ng, Np1);
FOR i:= 1 TO 2 DO BEGIN
j:= Rg + i; IF j>3 THEN Dec(j, 3);
q:= Power(Lc[j], Np1); p:= Cc[j] * q;
r:= s - p; s:= r
END;
q:= Cc1[Rg] * s; p:= Power(Abs(q), Nm1); IF (s>0) THEN q:= p
ELSE q:= -p;
IcFgrvb:= q
END;
FUNCTION BlFrvg(Ngris, Iro, Ive: Reel): Reel;
VAR ListeC: Lst3R;
BEGIN
ListeC[1]:= Iro; ListeC[2]:= Ive; ListeC[3]:= 0;
BlFrvg:= IcFgrvb(3, Ngris, ListeC)
END;
FUNCTION VeFrgb(Ngris, Iro, Ibl: Reel): Reel;
VAR ListeC: Lst3R;
BEGIN
ListeC[1]:= Iro; ListeC[2]:= 0; ListeC[3]:= Ibl;
VeFrgb:= IcFgrvb(2, Ngris, ListeC)
END;
FUNCTION RoFgvb(Ngris, Ive, Ibl: Reel): Reel;
VAR ListeC: Lst3R;
BEGIN
ListeC[1]:= 0; ListeC[2]:= Ive; ListeC[3]:= Ibl;
RoFgvb:= IcFgrvb(1, Ngris, ListeC)
END;
// ListeNg = 255*(0.1^n, 0.3^n, 0.5^n, 0.7^n, 0.9^n) avec n = (1/2.2)
PROCEDURE Init_3_MatIm(IndiceC: Byte; La, Ha: Z_32; VAR Ma: Tab_Pix); // TYPE Z_32 = LongInt;
CONST Cmax = 255; Kmax = 100000;
ListeNg: ARRAY[1..5] OF Reel = (89.5, 147.5, 186.1, 216.8, 243.1);
VAR c, h, i, j: Byte; k, x, y: Z_32; q, C_23, z: Reel; P_Gr: Pixel;
BEGIN
FOR h:= 1 TO 5 DO
BEGIN
i:= IndiceC - 1; IF i<1 THEN Inc(i, 3);
j:= IndiceC + 1; IF j>3 THEN Dec(j, 3);
k:= Sqr(h); q:= 0.04 * k; // Couleurs
c:= Round(Cmax * q); P_Gr[IndiceC]:= Cmax - c; // arbitraires pr
q:= Sqr(h * (6 - h)); P_Gr[i]:= Round(3.148 * q); // les graphes
P_Gr[j]:= Cmax; Dec(P_Gr[j], 51 * h);
FOR k:= 1 TO Kmax DO // Base des exponentielles > 0
BEGIN
q:= k / Kmax; x:= Round(La * q); C_23:= 255 * q;
CASE IndiceC OF 1: z:= RoFgvb(ListeNg[h], C_23, C_23);
2: z:= VeFrgb(ListeNg[h], C_23, C_23);
3: z:= BlFrvg(ListeNg[h], C_23, C_23) END;
q:= z / 255; y:= Round(Ha * q);
IF ((0<=y) AND (y<=Ha)) THEN
FOR i:= 1 TO 3 DO Ma[x, y][i]:= P_Gr[4 - i]
END // Inversion (r,v,b) / (b,v,r)
END
END; |
Partager