home *** CD-ROM | disk | FTP | other *** search
- {programme de compactage d'image , algorythme du quad tree }
- { ou arbre a quatre branche}
- { on regarde si le rectangle est forme de la meme couleur }
- { si oui alors on sauvegarde en memoire , les specifications
- du rectangle , ou alors la forme de arbre }
- { si non on divise le carre en 4 , et on aplique recursivement pour les
- 4 petits carres le meme algorythme }
- { l'Autre algorythme est sur le meme principe
- on ne coupe pas en quatre carre , mais en trois rectangles
- dont l'un est homogene en couleur
- (donc recherche du rectangle le plus grand de la meme couleur)
- ,et on applique la meme chose pour les deux autres rectangles}
-
- program compactage;
- uses crt,graph;
- const max=5000;
- type ca= RECORD
- c: word;
- l: word;
- h: word;
- x: word;
- y: word;
- END;
- tab= array[1..max] of ca;
- var t: tab;
- i,ni: word;
- a: char;
-
- PROCEDURE INITGRAPHIC ;
- VAR
- GraphDriver , GraphMode ,CodeErreur : integer ;
- BEGIN
- GraphDriver := Detect ;
- InitGraph (GraphDriver,GraphMode,'c:\t7\bgi') ;
- CodeErreur := GraphResult ;
- If CodeErreur <> GrOk Then
- Begin
- Writeln ('Erreur en mode graphique : ',GraphErrorMsg (GraphDriver));
- Readln ;
- Halt (1) ;
- End ;
- END ;
- {regarde si un rectangle est rempli d'une couleur unique}
- function homogene(x,y,lar,hau:word):boolean;
- var xt,yt,c,cn:word;
- test: boolean;
- BEGIN
- xt:=0;
- test:=true;
- c:=getpixel(x,y);
- repeat
- yt:=0;
- repeat
- cn:=getpixel(x+xt,y+yt);
- if c<>cn then test:=false;
- c:=cn;
- inc (yt);
- until (yt>=lar) or (not(test));
- inc(xt);
- until (xt>=hau) or (not(test));
- homogene:=test;
- END;
-
- {compactage quad tree }
- procedure COMPACTE(x,y,lar:word);
- var test: boolean;
- c: word;
- BEGIN
- test:=homogene(x,y,lar,lar);
- if test then
- BEGIN
- t[i].l:=lar;
- t[i].h:=lar;
- t[i].x:=x;
- t[i].y:=y;
- t[i].c:=getpixel(x,y);
- inc(i);
- rectangle(x+270,y+10,x+lar+270,y+lar+10);
- END
- else BEGIN
- compacte(x,y,lar div 2);
- compacte(x+lar div 2,y,lar div 2);
- compacte(x+lar div 2,y+lar div 2,lar div 2);
- compacte(x,y+lar div 2,lar div 2);
- END;
- END;
-
- procedure carre(x,y:word;lar,haut:word;c:word);
- var xt,yt:word;
- BEGIN
- xt:=0;
- repeat
- yt:=0;
- repeat
- putpixel(x+xt+270,y+yt+144,c);
- inc (yt);
- until (yt>=lar);
- inc(xt);
- until (xt>=haut);
- END;
-
- procedure aff( x,y,lar: word);
- BEGIN
-
- if t[i].l<lar then
- BEGIN
- aff(x,y,lar div 2);
- aff(x+lar div 2,y,lar div 2);
- aff(x,y+lar div 2,lar div 2);
- aff(x+lar div 2,y+lar div 2,lar div 2);
- END
- else if t[i].l=lar then
- BEGIN
- CARRE(x,y,lar,lar,t[i].c);
- inc(i);
- END;
- END;
- function vn(i:word):string;
- var s:string;
- BEGIN
- s:=chr(i div 1000+48);
- s:=s+chr((i div 100) mod 10+48);
- s:=s+chr(((i div 10) mod 10) mod 10+48);
- s:=s+chr(i mod 10+48);
- vn:=s;
- END;
-
- procedure bidoulle(n,m:word;direction:boolean);
- BEGIN
- if direction then t[n].h:=t[n].h+t[m].h
- else
- t[n].l:=t[n].l+t[m].l;
- t[m].l:=0;
- t[m].h:=0;
- t[m].x:=0;
- t[m].y:=0;
- END;
-
- { deuxieme algo de compactage }
- procedure compactdeux(i:word);
- var n,m: word;
- test:boolean;
- BEGIN
- test:=true;
- for n:=1 to i do
- if t[n].l<>0 then
- BEGIN
- REPEAT
- test:=true;
- for m:=1 to i do
- BEGIN
- if (t[m].l<>0) and (n<>m) and (t[n].c=t[m].c) then
- BEGIN
- if (t[n].x+t[n].h=t[m].x) and (t[n].l=t[m].l)
- and (t[n].y=t[m].y)
- then
- BEGIN
- bidoulle(n,m,true);
- test:=false;
- END;
- if (t[n].y+t[n].l=t[m].y) and (t[n].h=t[m].h)
- and (t[n].x=t[m].x)
- then
- BEGIN
- bidoulle(n,m,false);
- test:=false;
- END;
- END;
- END;
- until test;
- END;
- END;
-
- procedure aff2(i:word);
- var n: word;
- BEGIN
- for n:=1 to i do
- if t[n].l<>0 then
- rectangle(t[n].x,t[n].y+144,t[n].x+t[n].h,t[n].y+t[n].l+144);
- END;
-
- procedure aff3(i:word;var ni:word);
- var n: word;
- BEGIN
- ni:=0;
- for n:=1 to i do
- if t[n].l<>0 then
- BEGIN
- inc(ni);
- carre(t[n].x,t[n].y,t[n].l,t[n].h,t[n].c);
- END;
- END;
-
- BEGIN
- for i:=1 to max do BEGIN t[i].l:=0;t[i].c:=0;END;
- i:=1;
- initgraphic;
- circle(64,64,50);
- floodfill(65,65,getcolor);
- setcolor(2);
- compacte(0,0,128);
- setcolor(getcolor);
- dec(i);
- compactdeux(i);
- aff2(i);
- {aff(0,0,256);}
- outtextxy(256,0,'nb feuille= '+vn(i));
- repeat until keypressed;
- aff3(i,ni);
- outtextxy(400,0,'nb feuille= '+vn(ni));
- a:=readkey;
- end.