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 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
|
type tGrosSetOfTColorsOrInteger = Object //Class
Bmp : tBitMap; R,G,B : byte; Count : Cardinal;
procedure Create;
procedure Grow;
procedure Add(inVal : TColor);
procedure Delete(inVal : TColor);
function Contains(testVal : TColor) : boolean;
procedure AddSet(inSet : tGrosSetOfTColorsOrInteger); //<- à faire une autre fois Set1 = Set1 + Set2
procedure Clear;
procedure Free;
end;
implementation
{$R *.DFM}
procedure tGrosSetOfTColorsOrInteger.Create;
begin Bmp:=tBitMap.create;
with Bmp do
begin height:=256; // hauteur constante
width:=1; // largeur initiale
pixelFormat:=pf24bit;
Canvas.Brush.Color:=RGB(1,1,1);
Canvas.FillRect(Rect(0,0,width,height));
end;
Count:=0;
end;
type tRGBTripleArray = array [WORD] of tRGBTriple;
pRGBTripleArray = ^tRGBTripleArray;
procedure tGrosSetOfTColorsOrInteger.Grow; // Elargissement de l'ensemble
begin with Bmp do
begin width:=width+1;
canvas.Pen.Color:=RGB(1,1,1);
canvas.MoveTo(width-1,0);
canvas.LineTo(width-1,height-1);
canvas.refresh;
end;
end;
procedure tGrosSetOfTColorsOrInteger.Add(inVal : TColor);
var rangee: pRGBTripleArray; i : integer;
begin R:=GetRValue(inVal);
G:=GetGValue(inVal);
B:=GetBValue(inVal);
with bmp do
begin rangee := Scanline[R]; // on range directement dans la ligne d'indice R
i:=-1;
repeat inc(i);
until (i=width-1)
or ((rangee[i].rgbtGreen=1) and (rangee[i].rgbtBlue=1))
or ((rangee[i].rgbtGreen=G) and (rangee[i].rgbtBlue=B));
if (rangee[i].rgbtGreen=G) and (rangee[i].rgbtBlue=B)
then EXIT
else
if (i=width-1) and (rangee[i].rgbtGreen<>1) and (rangee[i].rgbtBlue<>1)
then begin Grow; Add(inVal); end
else begin inc(Count);
rangee[i].rgbtRed:=R; rangee[i].rgbtGreen:=G; rangee[i].rgbtBlue:=B;
EXIT;
end;
end;
end;
procedure tGrosSetOfTColorsOrInteger.Delete(inVal : TColor);
var rangee: pRGBTripleArray; i : integer;
begin R:=GetRValue(inVal);
G:=GetGValue(inVal);
B:=GetBValue(inVal);
with bmp do
begin rangee := Scanline[R]; // on va directement dans la ligne d'indice R
i:=0;
while (i<width-1) and (rangee[i].rgbtGreen<>G) and (rangee[i].rgbtBlue<>B)
do inc(i);
if (rangee[i].rgbtGreen=G) and (rangee[i].rgbtBlue=B) then
begin rangee[i].rgbtRed:=1; rangee[i].rgbtGreen:=1; rangee[i].rgbtBlue:=1;
Dec(Count);
end;
end;
end;
function tGrosSetOfTColorsOrInteger.Contains(testVal : TColor) : boolean;
var rangee: pRGBTripleArray; i : integer;
begin R:=GetRValue(testVal);
G:=GetGValue(testVal);
B:=GetBValue(testVal);
with bmp do
begin rangee := Scanline[R]; // on saute directement sur la ligne d'indice R
i:=-1;
repeat inc(i);
if (rangee[i].rgbtGreen = G)
and (rangee[i].rgbtBlue = B)
and (rangee[i].rgbtRed = R)
then begin RESULT:=true; EXIT; end;
until (i=width-1);
end;
RESULT:=false;
end;
procedure tGrosSetOfTColorsOrInteger.AddSet(inSet : tGrosSetOfTColorsOrInteger);
begin //à faire une autre fois Set1 = Set1 + Set2
end;
procedure tGrosSetOfTColorsOrInteger.Clear;
begin with Bmp do
begin width:=1;
Canvas.Brush.Color:=RGB(1,1,1);
Canvas.FillRect(Rect(0,0,width,height));
end;
Count:=0;
end;
procedure tGrosSetOfTColorsOrInteger.Free;
begin Bmp.Free; end;
// Utilisation :
var BigSet : tGrosSetOfTColorsOrInteger;
procedure TfrmSetOf.bSetBmpClick(Sender: TObject);
var i,j,k : integer; Entier : integer;
begin memo1.clear;
BigSet.Create;
BigSet.Add(clGreen);
BigSet.Add(clRed);
BigSet.Add(RGB(44,255,22));
BigSet.Add(RGB(255,255,22));
BigSet.Add(clLime);
BigSet.Add(RGB(255,128,255));
if BigSet.Contains(clRed) then showMessage('1 : Rouge présent : ok')
else showMessage('1 : Rouge absent');
if BigSet.Contains(clGreen) then showMessage('1 : Vert présent : ok')
else showMessage('1 : Vert absent');
if BigSet.Contains(clYellow) then showMessage('2 : Jaune présent')
else showMessage('2 : Jaune absent : ok');
BigSet.Add(clYellow);
if BigSet.Contains(clYellow) then showMessage('3 : Jaune présent : ok')
else showMessage('3 : Jaune absent');
BigSet.Add(clYellow);
if BigSet.Contains(RGB(43,255,22)) then showMessage('4 : 43,255,22 présent')
else showMessage('4 : 43,255,22 absent : ok');
if BigSet.Contains(RGB(44,255,22)) then showMessage('5 : 44,255,22 présent : ok')
else showMessage('5 : 44,255,22 absent');
BigSet.Delete(clRed);
if BigSet.Contains(clRed) then showMessage('6 : Rouge présent')
else showMessage('6 : Rouge absent : ok');
if BigSet.Contains(clYellow) then showMessage('7 : Jaune présent : ok')
else showMessage('7 : Jaune absent');
for i:=1 to 100 do BigSet.Add(clYellow); // n''en rajoute qu'un seul s'il est absent
if BigSet.Contains(clBlack) then showMessage('8 : Noir absolu présent ')
else showMessage('8 : Noir absolu absent : ok');
BigSet.Add(clBlack);
if BigSet.Contains(clBlack) then showMessage('9 : Noir absolu présent : ok')
else showMessage('9 : Noir absolu absent');
Entier:=888888;
BigSet.Add(Entier); //<- Ajout d''un entier pris pour un TColor qui est aussi un integer
if BigSet.Contains(Entier) then showMessage('10 : Entier présent : ok')
else showMessage('10 : Entier absent');
BigSet.Delete(Entier);
if BigSet.Contains(Entier) then showMessage('11 : Entier présent ')
else showMessage('11 : Entier absent : ok');
for i:=0 to 255 do
for j:=0 to 255 do BigSet.Add(RGB(j,i,128));
BigSet.Free;
end;
procedure TfrmSetOf.bTestVitesseClick(Sender: TObject);
var i,j : integer;
begin TopChrono:=GetTickCount;
BigSet.Create;
// A ) Expansion de l'ensemble :
for i:=0 to 100000 do BigSet.Add(i);
Trace(ChronoMis); // pour 100000 : 515 ms (Pentium III 1.13 GHz)
if BigSet.Contains(100000) then Trace('12 : 100000 présent : ok')
else Trace('12 : 100000 absent');
if BigSet.Contains(100001) then Trace('13 : 100001 présent')
else Trace('13 : 100001 absent : ok');
// B ) Recherches dans l'ensemble de l'élément absent :
TopChrono:=GetTickCount;
for i:=0 to 100000 do if BigSet.Contains(100001) then {} else j:=i;
Trace(ChronoMis); //pour 100000 : 287 ms
BigSet.Free;
end;
// P.S : la procedure "Trace" se contente d'alimenter un memo
// et la function ChronoMis renvoie simplement la chaine du delta-T |
Partager