• Aucun résultat trouvé

Xlim3D: Un logiciel de traitement d'image

N/A
N/A
Protected

Academic year: 2021

Partager "Xlim3D: Un logiciel de traitement d'image"

Copied!
269
0
0

Texte intégral

(1)

Un logi iel de traitement d'image

[Projet RACE℄

Do umentation editee par Mar Van Droogenbroe k

(2)
(3)

Le logi iel Xlim3D est le fruit du travail de plusieurs her heurs du Centre de Morphologie

Mathematique de Fontainebleau. Au depart, ha undeveloppait espropres fon tions mais,

au ldu temps,il devient indispensabled'integrer esparties pourpermettrea denouveaux

utilisateursd'enbene ier. Lemanquede oheren e,tantauniveaudelanomen laturequ'au

niveau de la programmation, se traduit par une omplexite supplementairede l'initiation a

elogi iel.

Cedo ument presentedi erentstravauxettented'uniformiserle adre detravailfutur,pour

enrayeruneeventuelle derive...

Ontrouveraal'interieur de e manueldestextese rits enpartiepardespersonnesqu'ilfaut

iter:

Jean-Fran ois Rivest Il lui revient le merite d'avoir e rit la premiere librairie eto ee de

traitement d'imagesau Centreetde l'avoir di usee;

Christophe Gratin L'initiateurdes traitements morphologiquestridimensionnelspar

logi- iel. Sa librairie s'appuiesur l'interpreteur Xlisp-Stat,qui est devenu l'interpreteur de

base ;

Hugues Talbot Le on epteurdenombreusesfon tions,y ompris ellestraitantlesgraphes

;

Mike Clarkson Le premiera avoir propose etintegre les travauxdes her heurs.

Ilfautegalement remer ier les di erentes personnes quiont ontribue au developpement du

(4)

Droogen-I L'interpreteur de ommandes iii

1 Utilisation de l'interpreteur v

1.1 Lespremiers pas . . . vi

1.1.1 Debut d'unesession . . . vi

1.1.2 Quelques expli ations on ernant lelangage . . . vi

1.2 Lestypesd'objets ren ontres . . . vii

1.2.1 Les typesdedonnees . . . vii

1.2.2  Evaluationsetassignations . . . viii

1.2.3 L'orientationobjet . . . x

1.3 Operationssur desnombres . . . x

1.4 Operationssur quelquestypes dedonneesparti ulieres . . . xii

1.4.1 Cha^nesde ara teres . . . xii

1.4.2 Listes . . . xiii

1.4.3 Tableaux . . . xiv

1.5 Operationsbooleennes ettests . . . xiv

1.5.1 Operationslogiques . . . xiv

1.5.2 Tests de omparaison . . . xv

1.6 Contr^ole debou les. . . xv

1.6.1 Blo s . . . xv

1.6.2 Prisede de ision . . . xv

1.6.3 Bou les iteratives. . . xvi

1.7 Manipulationdes hierset impression. . . xvii

1.7.1 Manipulationdes hiers . . . xvii

1.7.2 Impression . . . xix

1.8 Fi hiers ript . . . xx

2 Les omposantes de Xlim3d xxi 2.1 Lesimages. . . xxi

2.1.1 La stru tured'image 2D . . . xxi

2.1.2 La stru tured'image 3D . . . xxii

2.2 Lesgraphes . . . xxiv

2.2.1 Lesgraphes entant que stru turesupplementaire . . . xxiv

2.2.2 Lesgraphes relatifsala partie3D . . . xxvii

(5)

3 Developpement de programmes xxxi

3.1 Developpement de programmes Lisp . . . xxxi

3.1.1 Ajoutd'une fon tion . . . xxxi

3.1.2 Chargement de hiers . . . xxxiv

3.1.3 Deboggage . . . xxxiv

3.2 Developpement de librairies ompilees . . . xxxvi

3.2.1 Ajoutd'une fon tion . . . xxxvi

3.2.2 Exemple: developperunefon tionquitraiteles graphes . . . xxxvii

3.2.3 Deboggage . . . xlii II Xlim3D: manuel de referen e 1 4 Les images 3 4.1 La stru tured'image . . . 3 4.2 La grilled'image . . . 4 4.3 Entree etsortie . . . 5 4.3.1 Le tured'images . . . 5 4.3.2 E ritured'images. . . 12 4.3.3 Visualisationd'images . . . 16

4.3.4 Agrandissementd'images (zoomdire t etinverse) . . . 21

4.3.5 Impression d'imagesa l'e ran . . . 23

4.4 Conversion de formatd'image . . . 23

4.5 Proprietesd'image . . . 24

4.5.1 A es aux ara teristiques desimages . . . 29

4.5.2 A es auxvaleursdes images . . . 33

4.5.3 Translation, rotationettransposition. . . 34

4.6 Operationselementaires surdes images. . . 37

4.6.1 Operationselementaires surdes ensembles . . . 37

4.6.2 Operationselementaires surdes images enniveaux de gris . . . 37

4.6.3 Seuillage. . . 39

4.6.4 Fon tions al uleesen haque pixel . . . 41

4.6.5 Operationsarithmetiques . . . 42

4.6.6 Comparaisond'images . . . 47

4.7 Manipulationdesniveaux de gris . . . 49

4.8 Gestionde lamemoire . . . 50

4.8.1 Creationetdestru tion d'images . . . 50

4.8.2 Gestiond'une fen^etre dansl'image . . . 55

4.9 Copie{ olleret masquage . . . 56

4.10 Transformations lineaires . . . 57

4.10.1 Filtrage par onvolution . . . 57

4.10.2 Filtrage parpassagedansle domainetransforme . . . 58

(6)

5 Operations morphologiques de base 65

5.1 Erosionetdilatation . . . 65

5.1.1 Erosion etdilatationave deselementsstru turantsspe i ques . . . . 67

5.1.2 Erosion etdilatationdansdes dire tionsarbitraires. . . 68

5.1.3 Erosion etdilatationadaptativesdans desdire tions quel onques . . . 71

5.2 Erosionetdilatation de rang{maximum . . . 73

5.3 Erosionetdilatation ave deselements stru turantsen niveaux de gris . . . . 74

6 Pro edures elementaires 77 6.1 Ouvertureetfermeture. . . 77

6.1.1 Ouvertureetfermeture ave deselements stru turantsspe i ques. . . 78

6.1.2 Ouvertureetfermeture dansdesdire tions quel onques . . . 80

6.1.3 Ouvertureetfermeture adaptativesdansdesdire tions quel onques . 83 6.2 Ouvertureetfermeturede rang{maximum . . . 85

6.3 Ouvertureetfermetureave desfon tions stru turantes . . . 86

6.4 Filtragemorphologique. . . 87

6.4.1 Toggle mapping ( ontraste) . . . 87

6.4.2 Filtres auto-median . . . 87

6.4.3 Supremumde plusieursoperateurs . . . 88

7 Composantes onnexes 91 7.1 Mesuresfondamentales . . . 91

7.2 Mesuresde frequen es . . . 92

7.2.1 Histogrammes. . . 92

7.2.2 Manipulationd'histogramme . . . 93

7.3 Mesuresstatistiquesetdistributionsaleatoires. . . 94

7.3.1 Generation de valeurs aleatoires. . . 101

7.4 Analysedeparti ules individuelles . . . 101

7.4.1 \Labelisation"de parti ules . . . 101

7.4.2 Nombre d'Euler. . . 104

7.4.3 Statistiquesd'image surdes domainesde nispardes labels . . . 105

7.5 Granulometrie . . . 109 7.6 Fon tiondistan e . . . 109 8 Gradients 113 8.1 Gradientsusuels . . . 113 8.2 Residus . . . 114 8.3 Chapeau haut-de-forme . . . 115 8.4 Gradientsde surfa e . . . 117 8.4.1 Azimuthdu gradient . . . 117 9 Squelettes 119 9.1 Squelettes binaires onstruitsa partirde marqueurs . . . 120

9.2 Centrodes. . . 120

9.3 Transformee partoutou rien . . . 121

(7)

9.5.1 Amin issement homotopique . . . 123

9.5.2 Amin issement isotrope . . . 123

9.5.3 Squelettepar e hage . . . 124

9.6 Points ritiques,etudedu voisinage . . . 124

9.6.1 Pointsde terminaison . . . 124

9.6.2 Pointsmultiples . . . 125

9.7 Ebarbulage . . . 126

10 Geodesie 127 10.1 Erosionetdilatation geodesiques . . . 127

10.2 Re onstru tions . . . 129

10.2.1 Sele tiond'objets parre onstru tion . . . 131

10.3 Residus obtenus apres re onstru tion . . . 132

10.4 Fon tions de distan egeodesique . . . 132

10.5 Zonesd'in uen egeodesique. . . 133

10.5.1 Squelettes parzones d'in uen e. . . 133

11 Ligne de partage des eaux, integrale et e hage 135 11.1 Lignede partage des eaux . . . 135

11.2 Lignede partage des eauxave marqueurs . . . 138

11.3 Integrale . . . 139

11.4 Fle hage . . . 141

12 Dete tion des extrema et dynamique 147 12.1 Dete tion d'extrema regionaux . . . 147

12.2 Dynamique . . . 151

13 Les graphes 3D 153 13.1 Graphesprede nisetfon tions s'yappliquant . . . 153

13.1.1 Variables . . . 153

13.1.2 Fon tions surles graphes . . . 154

14 Codage 157 14.1 Cha^nesdeFreeman . . . 157

15 Analyse de textures et lassi ation 159 15.1 Traitement de textures . . . 159

16 Un langage pour le traitement d'images 161 16.1 Commandedu systeme d'exploitation . . . 161

17 Non- lasse 163 18 Les elementsstru turants: lasses et methodes 165 18.1 La lasseSelement . . . 165

18.1.1 Donnees . . . 165

(8)

18.2.1 Donnees . . . 165 18.2.2 Methodes . . . 166 18.3 La lasseHomoteti SE . . . 168 18.3.1 Donnees . . . 168 18.3.2 Methodes . . . 168 18.4 La lasseImageSE . . . 170 18.4.1 Donnees . . . 170 18.4.2 Methodes . . . 170

19 Les graphes: nouvelle stru ture dans XLispStat 173 19.1 Lesfon tions surles graphes. . . 174

19.1.1 Creationetdestru tion de graphes . . . 174

19.1.2 AÆ herles graphes. . . 176

19.1.3 Arithmetique surles graphes . . . 177

19.1.4 Comparaisonde deux graphes. . . 178

19.1.5 Informationsur lesgraphes . . . 178

19.1.6 Operationsmorphologiques . . . 179

19.1.7 Operationlineaires . . . 180

19.1.8 Marquaged'un nuddu graphe . . . 181

19.1.9 Graphes etarbres . . . 181

III Ra e Proje t 183 20 Fun tion des ription 185 20.1 Generalpurposeand system . . . 185

20.2 Read&writeimages . . . 185

20.3 Visualizationand general imagemanipulation . . . 186

20.4 Filters . . . 186 20.5 Re onstru tion . . . 187 20.6 Skeleton . . . 188 20.7 Labeling . . . 190 20.8 Contour . . . 192 20.9 Coding. . . 194 20.10Entropy oding . . . 196 20.11Bu ermanipulation . . . 198

(9)
(10)
(11)
(12)

Utilisation de l'interpreteur

Il est bien onnu que le langage Lisp est un langage d'intelligen e arti ielle. La plupart

desmanuelsquilede rivent ont e type d'appli ationsal'esprit. La pratiquereserve

epen-dant un autre usage a l'interpreteur; dans ertaines appli ations, il sert de lien ave des

librairies de langage ompile. Les raisons sont simples: on a la fa ilite d'un langage

in-terprete ave la vitesse d'un langage ompile. Cela permet des developpements rapides de

programmes puisqu'onevite la ompilation etpar e qu'il est possiblede dialoguer aisement

ave l'interpreteur, parexempleen aÆ hant desmessages.

Le programme Xlim3D est base sur le langage de ni par l'interpreteur Xlisp-Stat qui

permet toute une serie d'operations omprenant notamment des manipulationsstatistiques

de donnees, des operations ve torielles, un systeme de programmation oriente objet et un

me anisme d'allo ationdynamique. Des librairiesde traitement d'image ont ensuite ete

gr-e ees sur e noyau en exploitant au mieux les deux derniers atouts du langage interprete,

'est-a-direqu'unepartiedestraitements(notamment eluideselementsstru turants)sefait

dans la philosophied'une orientation objet et que l'interpreteur harge dynamiquement des

librairiessuivantles besoins. Celaeuteteimpossibleave l'interpreteurXlispsurlequeletait

onstruitXlim[3 ℄. C'est ChristopheGratin[1 ℄quia songe autiliserl'interpreteur Xlisp-Stat

pour pro ter du potentiel de l'orientation objet. Il faut aussi feli iter Mi hel Bilodeau qui

a opere lafusiondes logi ielsexistants pouren faire des\pa kages" que l'on peuta present

harger dynamiquement. Gr^a e a e hargement, il est possible d'inserer du ode ompile

m^eme durant l'utilisation de l'interpreteur pour e e tuer une mise au point ou eviter que

l'interpreteur ne prenne trop de memoire au hargement. Remer ions en n Jean-Fran ois

Rivest dont lesrapportsont servi de baseau present do ument.

Cettepartie dumanuelde rit l'utilisationdu langage interprete. Sansvouloiretablirune

listeexhaustivedesfon tions(voir[4 ℄pour ela),nouspresenteronsles ommandesdebasede

l'interpreteurendetaillantlesquelquesparti ularitesdulangageXlisp-Statquiledi eren ient

(13)

x CHAPTER 1. UTILISATION DE L'INTERPRETEUR

1.1 Les premiers pas

1.1.1 Debut d'une session

Assurez-vousd'abordqueles exe utablesXlim3detxlispsontde nies dansvotre\PATH".

Si le logi iel est bien on gure, il suÆt de le lan er en tapant la ommande Xlim3d. Le

programme veri e alors si le repertoire ourant ontient un hier init.lsp, sinon il vous

demande d'en pla er un dans le repertoire. Ce hier est important par e qu'il de nit des

variablesbienutilesal'utilisationdeslibrairiesdetraitementd'image. Onpeutaussiajouter

des ommandes qui on gurent l'interpreteur d'une ertaine maniere, omme en hargeant

pardefautl'uneoul'autrelibrairie,ou en oredemanderaXlim3dde hargerimmediatement

un hier en faisant Xlim3d fi hier.lsp. L'interpreteur hargera alors init.lsp et

en-suite fi hier.lsp. Pour sortir du programme, Ctrl-C ne fon tionne pas par e que ette

ommande est reservee a l'interruption deroutinesLispmaisil fauttaper(exit).

1.1.2 Quelques expli ations on ernant le langage

Ilya deuxtypesderesultat quel'interpreteur deXlim3D est apablede fournir. Le premier

est l'evaluation d'une expression. Les quelques lignes suivantes de nissent une variable et



evaluent son ontenu:

> (setf a 10)

10

> a

10

>

La variableavautbien10. La deuxieme utilite estlarealisation d'unea tion, e quien Lisp

s'exprimeparun jeude parentheses ontenant lafon tionet ses arguments. Ainsi,

> (+ 1 2)

3

>

realise l'addition de 1 et 2. En fait, Lisp utilise une notation fon tionnelle sous la forme

(fon tion argument1 argument2), evalue la quantite entre parentheses et retourne le

resultat de l'evaluation. Chaque valeurpeutalors^etre utilisee omme argument d'une autre

fon tionelle-m^emeentreparenthesesetainsidesuite. Laprioriteestdonneeauxparentheses

interieures. Lesinstru tions

> (+ (* 2 3) 4)

10

>

seront traduites respe tivement par(+ 6 4)etpuispar10.

Le langage Lisp est base sur le on ept de liste. En d'autres termes, ontrairement au

langage C, le nombre d'argumentsdes fon tions ainsique leurtype est plussouple. Le Lisp

(14)

Les ommentaires ommen ent toujours par un point virgule (;). Tout e qui suit sur

la m^eme ligne sera ignore par l'interpreteur. Notons aussi que l'interpreteur onvertit tout,

hormisles ha^nes ara teres,enmajus ules. Nous onseillonsneanmoinsd'utiliserdes

majus- ulesa ertainsmomentspouraugmenterlalisibilitedu ode,parexemplelorsdelade nition

de onstantes.

1.2 Les types d'objets ren ontres

Le Lispmanipuledesnuds,sortes d'entite debasequi ontiennentdesinformations omme

une valeur, un type, ... Une fon tion ou une image est ontenue dans un nud. Cette

stru ture fondamentale est a l'origine de l'implementation en C de l'interpreteur et quand

sontvenuesleslibrairiesde traitement d'images,ilafalluadapterlastru turedunudpour

qu'iltraite orre tement les images.

1.2.1 Les types de donnees

Xlisp-Stat gere plusieurstypes de donnees. Voi i laliste des prin ipauxtypes proposes par

l'interpreteur a laquellenous avons ajoute les typesimage et graphe:

 Les entiers. Ce sont deslong omme enlangage C;

 Lespoints ottants. Cesontdesdouble ommeenlangage C.Ilfauttoujoursmettre

le pointde imaldans unnombrea n qu'iln'yait pasde meprise, ommedans\5.0";

 Les nombres omplexes. En guise d'exemple, (setf a (sqrt -1)) ree le nombre

omplexe a;

 Les tableaux,quipeuvent ontenirtousles autrestypes,eux-m^eme omprislorsqu'on

veut fairedestableaux multidimensionnels;

 Les ha^nes de ara teres;

 Les objets;

 Les listes;

 Les variables booleennes. Elles n'ont que la valeur \true" notee T ou NIL qui est



egalement lesigne d'uneliste vide;

 Les pointeurs de hier(\streams");

 Les imagesquipeuvent ^etre 2Dou 3D;

 Les graphes.

Tester un type. Parfois, il peut^etre utilede savoir quelestletyped'unsymboleou d'un

argument de fon tion. Nous avons dressela listedes predi ats quiexaminent letype de leur

(15)

xii CHAPTER 1. UTILISATION DE L'INTERPRETEUR

 (floatp a) veri esi aest unreel;

 ( omplex a)veri esiaest un nombre omplexe;

 (numberp a)veri esiaest un nombre(entier,reelou omplexe);

 (arrayp a) veri esi aest untableau;

 (stringp a)veri esiaest une ha^nede ara teres;

 (obje tp a)veri esiaest un objet;

 (listp a) veri esiaest uneliste;

 (streamp a)veri esiaest un pointeurde hiers;

 (image2dp a) veri e siaest uneimage2D;

 (image3dp a) veri e siaest uneimage3D;

 (graphp a) veri esi aest ungraphe.

Ilyaunefon tionqui,bien que ene soitpasuntest proprementdit,retourneletype de

a entouteslettres: (type-of a).

1.2.2 

Evaluations et assignations

On assigne unevaleur a unevariable en utilisant la fon tion setf (ousetq) ou def. Cette

derniere instru tion memorise la variable et permet surtout de trouver une tra e des

on-stantesentapantl'instru tion(variables). Onlibereunevariablede nieave (def a)par

(undef 'a)(noterlapresen ed'un\quote"dontl'utiliteestde rite i-apres). Voi iquelques

exemples:

> (setf var 5) ; On ree la variable var ontenant 5

5 ; Xlisp repond ela

> var ; On evalue var

5 ; Xlisp repond ela

> (def GRID "s") ; La onstante GRID re oit la haine "s"

GRID

> (variables) ; La fon tion qui imprime la liste des onstantes

(GRID)

> (undef 'GRID) ; On lib\`ere GRID

GRID

> (variables) ; La liste sera vide

NIL

>

On peutegalement fairedesassignations multiples:

> (setf b 4 6 d "foo")

(16)

Laderniereexpressionevaluee sera ellequisera retournee.

Uneregleimportanteaproposdesassignations: nejamaisassignerunsymboledejareserve

par le systeme { 'est la raison pour laquelle les fon tions usuelles de Xlisp-Stat se trouvent

dansl'indexdesfon tionsetdanslepaquetxlispstatdel'indexdes\pa kages". Ce inepeut

que auserdesproblemes. Frequemment,Xlisp neseplaindrapasmaise rasera tout

simple-ment la valeur pre edemment sto kee sous e nom, e qui peut avoir des e ets desastreux.

En parti ulier, ne jamais assigner le symbole `T', ou `NIL'... Ce sont des erreurs qui sont

ommunement faites. Parfois, il arrive qu'on ne desire pas evaluer uneexpression. Pour e

faire,Lispmetadispositionlafon tionquote ou'poureviteruneevaluation. Ainsi,(setf

plus '(+ a 5)),equivalentea (setf plus (quote (+ a 5))),est unefon tionquide nit

l'additionde a et5. Quelqueslignes pourillustrerle omportement:

> (setf plus (quote (+ a 5))) ; Definit une fon tion "plus"

(+ A 5)

> (setf a 5)

5

> (eval plus) ; "eval" for e l'evaluation de plus (interessant pour une

10 ; fon tion) > (setf a 15) 15 > (eval plus) 20 >

Enagissant delasorte, nousavonsde ni unefon tionavant quela variable ane soitde nie

puisquel'evaluation estrepoussee jusqu'aumoment del'appel(eval plus).

La fon tion quote est ouramment utilisee pour obtenir de l'aide sur une fon tion. En

e et,(help 'fon tion)fournituneaide en ligne. Dem^eme,(apropos 'name) listetoutes

lesfon tionsdontlenom ontientla ha^nede ara teres\name". Celameriteuneillustration:

> (help 'def)

DEF [fun tion-do ℄

Syntax: (def var form)

VAR is not evaluated and must be a symbol. Assigns the value of FORM to

VAR and adds VAR to the list *VARIABLES* of def'ed variables. Returns VAR.

If VAR is already bound and the global variable *ASK-ON-REDEFINE*

is not nil then you are asked if you want to redefine the variable.

NIL > (apropos 'ero) HERO A-SERO GBIPERO VEROS VEROH A-HERO SERO

(17)

xiv CHAPTER 1. UTILISATION DE L'INTERPRETEUR

ZEROP

ERO

NIL

Enayantfait(apropos 'ero),l'interpreteuraÆ helalistedetouteslesfon tionsqui

perme-ttentde faireuneerosionmorphologique(saufzerop). L'interpreteurest apabledegerer les

informationsd'aideparlui-m^emetressimplementa partird'une ha^ne de ara teres inseree

apres la de nition du prototype d'une fon tion. Cette possibilite est tellement importante

que,avantm^emeavoirexplique ommentde nirunefon tion,nousavonsjugeutiledefournir

un exemple.

> (defun aire (r)

"Cal ule l'aire d'un disque a partir de son rayon"

(* r r 3.14))

AIRE ; La fon tion aire existe desormais ainsi qu'une aide en ligne

> (help 'aire)

AIRE [fun tion-do ℄

Cal ule l'aire d'un disque a partir de son rayon

NIL

1.2.3 L'orientation objet

L'obje tif poursuivi par les on epteurs de Xlisp-Stat en introduisant des notions de

l'orientation objet est la fa ilite de mise au point de l'interfa e. Cela ne signi e pas que

l'utilisationdes on epts soitlimitee alaprogrammationdel'interfa egraphique. Xlisp-Stat

fournit un type \objet" et une serie de fon tions apables de les traiter. Par ailleurs, la

partie 3D de Xlim3D utilise une hierar hie d'objet pour traiter les elements stru turants.

Idealement, lesimages devraient^etre desobjets maisonest en oreloind'unetelle situation.

Nous invitons le le teur a onsulter le do ument [4℄ pour une des ription detaillee de

l'orientationobjetdansle adrede Xlisp-Stat.

Nous allons a present de rire une serie de fon tions qui s'appliquent aux di erents. La

listen'estbien s^urpasexhaustive maiselle omporte lesinstru tions lesplusutiles.

1.3 Operations sur des nombres

Avant d'entamer une des ription des fon tions qui traitent les nombres, il faut faire une

remarque on ernantlapresentationdesresultats. Un hi re3apparaissanttelquelal'e ran

peut ^etre un entier ou un reel. Sa hant que la fon tion sqrt retourne toujours un reel, on

peut omprendre e quisepasse quand on exe ute es quelqueslignes:

> (sqrt 9) ; On prend la ra ine arr\'ee de 9

3

> (integerp (sqrt 9))

NIL ; Le resultat n'est pas un entier ...

> (floatp (sqrt 9))

(18)

Conversion du type des nombres. Il est fondamental d'^etre apable de onvertir des

nombres d'un type dans un autre. Pour onvertir un reel en un entier, les operations sont

(trun ate a), quirendentieren supprimantla partiede imale, et (floor a),quitronque

toujours versle pluspetit entier. Pour onvertir un entieren reel,ilfautfaire(float a).

Operations arithmetiques. Voi i les operations importantes que l'on peut faire sur

les nombres: il y a les operations arithmetiques, qui peuvent prendre un nombre variable

d'arguments(2 au minimum):

 (+ a b ) Additionde a,b, ;

 (- a b ) Soustra tion de a,b, ;

 (* a b ) Multipli ationde a,b, ;

 (/ a b ) Divisionde aparbet . Cal ule(a=(b ));

 (min a b )Minimumentrea, b, ;

 (max a b )Maximumentrea, b, ;

 (rem a b) Reste de ladivisiondeapar b(Exemple: (rem 3.5 1.1)fournit0.2).

Si un des arguments des operations pre edentes est reel, le resultat sera reel luiaussi. Une

remarque importante sur ladivision. Ave l'an ieninterpreteur Xlisp,si tous les arguments

de la division etaient des entiers, la division etait entiere, i.e. le resultat etait tronque a

l'entier. Ce n'estplus le as dansla version a tuelle de Xlim3d quiretourne parfois un reel

m^eme siles arguments sont entiers. Parexemple,

> (/ 5 3) ; Un division entre nombres entiers

1.66667 ; ... ne produit pas un entier

> (integerp (/ 6 3))

T ; sauf si a est un multiple de b

>

Lesoperateursarithmetiquespeuventaussis'appliqueradeslistesouaunmelangedelistes

et de nombres. On dit alors que les fon tions ont ete \ve torisees". Quelques ommandes

illustrentlari hessedu langage.

> (+ '(1 2 3) '(4 5 6)) ; On additionne deux listes de meme longueur

(5 7 9)

> (+ 5 '(1 2 5)) ; Le nombre est ajoute a ha un des elements

(6 7 10)

>

Ily aaussides operationsa uneseuleoperande:

(19)

xvi CHAPTER 1. UTILISATION DE L'INTERPRETEUR

Operations parti ulieres. Voi iquelquesoperations quipeuvent servir:

 (abs a) Valeurabsoluede a;

 (sin a) Sinusde a. L'angleest exprime en radians;

 ( os a) Cosinusdea;

 (tan a) Tangentede a;

 (sqrt a) Ra ine arree de a(leresultat est ne essairement un reel);

 (exp a) Exponentiatione a

(leresultatest un reel);

 (expt a b) ou(^ a b) produit a b

ou aetbpeuvent^etre desentiersou desreels;

 (log a) Logarithme neperien;

 (random a) retourneun nombre aleatoire entre0 eta-1.

1.4 Operations sur quelques types de donnees parti ulieres

1.4.1 Cha^nes de ara teres

Le Lisp ontient tout edont onabesoinpourtraiterles ha^nes. Cettese tionnementionne

que e quiestleplusfrequemment ren ontre.

Lorsqu'on veut imprimer des ha^nes de ara teres, il peut s'averer utile de rajouter les

ara teres de ontr^ole suivants, unpeu telsqu'ilssont de nisdansle langage C:

 retour de hariot;

 retour de hariot sanssaut deligne;

 ara tere detabulation.

Pour on atener des ha^nes, on peut utiliserla fon tion (str at a b ...) qui

on- atene les ha^nes a b . La fon tion (format) produit le m^eme genre de resultat mais sa

mise en uvreest pluslourde.

Il y a egalement tout un ensemble de fon tions de omparaison. Par exemple, la

fon -tion (string= a b) qui ompare deux ha^nesde ara teres. Ave ette fon tion, on peut



egalement omparerdessous- ha^nesenutilisantles les:start1 :start2 :end1 :end2qui

indiquentrespe tivement le numerodu ara tere du debutde la omparaison pourla ha^ne

1, pourla ha^ne 2,etles nsde omparaison. Voi iquelquesexemples:

(string= "J Smith" "K Smith" :start1 1 :start2 1)

; supprime les premiers ara teres, et retourne T

(string= "a" "b") ; retourne NIL

(string= "a" "a") ; retourne T

Pour ouper des mor eauxde ha^nes, il ya aussiune fon tion: (subseq string start

(20)

1.4.2 Listes

Presque par de nition, Xlisp est apable de travailler sur des listes. D'abord une petite

expli ationsur equ'estuneliste. Ensuite,nousdetailleronsquelquesfon tionsdetraitement

delistes.

Unelisteestunensembledetaillevariabled'objetsquel onques omprisentreparentheses.

Onpeutegalement avoir deslistesde listes, des listesde tableaux, etainside suite. (12 15

18 22) et(12 "a" 3.14) sont toutesdeuxdes listes.

Ilyaunequantiteenorme de fon tionsquiservent agerer des listes. 

Etant donne que e

sont frequemment desstru tures imbriquees, il peutetre^ assez diÆ ilede savoir a quoion a

a estant les nuan es,quifont la erte deslispiens,sont nombreuses.

Voi ilesfon tions jugees les plusutiles:

 (list a b ...) ree uneliste ave les elements a b .... On peut aussi mettre

uneliste a l'interieur d'uneautre, ommedans l'exemple(list 1 2 (list 3 4))qui

retournera(1 2 (3 4));

 (first a) extraitet retournelepremierelement de lalistea;

 se ond, third, fourth retournent respe tivement le se ond, le troisieme et le

qua-triemeelement de laliste;

 (nth n liste) retournelen-emeelement de laliste;

 (rest liste)retournela listemoins lepremierelement;

 (last liste) retourne une liste omposee du dernier element de la liste. (append

liste1 liste 2)ajoutelaliste2auboutdelaliste1pourneformerqu'uneliste. Par

exemple: (append '(1 2 3) '(4))retourne (1 2 3 4).

Quelqueslignes pourillustrerl'usagedes fon tions:

> (setf a (list 1 2 3 4))

(1 2 3 4) ; Voi i e que Xlim3d retourne

> (setf b (list "Hello" "world"))

("Hello" "world")

> (setf '(1 2)) ; Remarquer la presen e du quote qui evite l'evaluation

(1 2)

> (list a b )

((1 2 3 4) ("Hello" "world") (1 2)) ; Listes imbriquees

> (append a b ) (1 2 3 4 "Hello" "world" 1 2) > (rest a) (2 3 4) > (last a) (4) > (se ond b)

(21)

xviii CHAPTER 1. UTILISATION DE L'INTERPRETEUR

1.4.3 Tableaux

Les tableaux sont des stru tures qui ressemblent beau oup a elles ren ontrees dans des

langagesdeprogrammationplustraditionnels ommeleFortran. Ona edeaunelementd'un

tableauenspe i ant sonnumero. L'indi edupremierelementestzero. Lestableaux, omme

en Fortran,ne peuventpas^etre rallongesaisement. Sionne onna^tpaslatailleinitialed'un

tableauetquelalongueurestsus eptiblede hanger onstamment,ilestpreferabled'utiliser

deslistes.

La di eren e notable des tableaux ave les autres langages, 'est qu'il est possible de

sto ker des donnees de type di erents dans un m^eme tableau. Par exemple, l'element 0

peut sto ker un entier, l'element 1 une liste, et . Commetoujours, pour fairedes tableaux

multidimensionnels,ilfautsto ker destableaux dansles tableaux.

Voi iquelquesfon tions pourgerer des tableaux:

 (make-array taille) ree untableau dela tailletaille;

 (ve tor e1 e2 e3 ...) ree un tableau et l'initialise ave les expressions e1 e2 e3

... La tailledu tableausera ajustee pour ontenir toutesles expressions;

 (aref tableau no)a ede al'element no dutableautableau.

Voi iun exemple:

> (setf tableau (make-array 2)) ; Creation d'un tableau

#(NIL NIL)

> (setf (aref tableau 0) 0) ; Assignation: tableau[0℄<=0

0

> (setf (aref tableau 1) '("a" 1)) ; Assignation: tableau[1℄<=(list "a" 1)

("a" 1)

> tableau ; Imprime le ontenu du tableau

#(0 ("a" 1))

1.5 Operations booleennes et tests

Ces operationssont destests a n de manipuler etde generer les variablesbooleennes vraies

T etfaussesNIL.

1.5.1 Operations logiques

On peutfairedes operationslogiquesave les variablesbooleennes:

 (and a b) et logiqueentre aetb;

 (or a b) oulogiqueentre aetb;

(22)

1.5.2 Tests de omparaison

Ily aun grandnombred'operateurs de omparaison. Voi i euxqui sont utiles:

 (= a b) veri e si aet b sont numeriquement egaux. Les arguments peuvent ^etre des

entiers ou desreels;

 (/= a b)veri esiaetbnesontpasegaux. Attention,(n=ab)estinterprete omme(=ab)etnonpas omme(==ab);(< a b)verifiesiaestpluspetitqueb;



 (> a b) veri esiaest plusgrand queb;

 (<= a b) veri esi aestpluspetitou egal ab;

 (>= a b) veri esi aestplusgrandou egal ab;

 (null a) veri esi laliste aestvide.

1.6 Contr^ole de bou les

Les lispiens ont tendan e a ne pas utiliser les stru tures de ontr^ole des programmes de la

m^emefa on quelerestedumonde. Dans ette se tion,nousmontrerons omment utiliserles

stru tures de ontr^olede Lispave unfort a ent langage C.

1.6.1 Blo s

Il y a quelques fon tions pour onstruire des blo s en Lisp. Les lispiens font generalement

la grima e et preferent utiliser d'autres onstru tions mais, omme il n'est pas question

d'esthetique i i,elles valent lapeined'^etre presentees.

 (prog1 (fa a) (fb a) (f a) ...)exe utelasequen edefon tions(fa a) (fb a)

(f a) ... La valeurretournee est elle de lapremiereexpressiona^etreevaluee;

 (progn (fa a) (fb a) (f a) ...) m^eme hose que (prog1 ...), sauf que 'est

maintenant leresultat de laderniereexpressiona^etre evaluee qui sera retournee.

Pourretournerunevaleurd'unblo d'instru tions,oud'unebou le,toutenl'interrompant,

utiliserlafon tion (return a). Cette fon tion retourne du blo en question lavaleur de a.

Cesfon tionssontexa tement ommedes onstru tionsdetype\begin{end"quel'onretrouve

enPas al.

1.6.2 Prise de de ision

Voi iles fon tions pourprendre desde isions.

 (when test (fa a) (fb a) (f a) ... )quand testestegal a T, exe ute lasuite

d'instru tions(fa a) (fb a) (f a)... C'est ommeun\if"enlangageC,saufqu'il

n'y a pasde lause\else";

(23)

xx CHAPTER 1. UTILISATION DE L'INTERPRETEUR

 (if test (then) (else optionnel)) si l'expression test est vraie, exe ute

l'expression then. Sinon, et s'il y a un else, exe ute elui- i. La valeur retournee est

ellede thenquandtestestvrai,sinonelse. S'iln'yapasdeelse,etquethenn'est

pas evaluee, 'est NIL qui est retourne. Il faut noter que si l'on desire faire plusieurs

operations dansunif, ilfaututiliserdesblo save prog1ou progn.

Quelquesexemples:

(when (= a b)

(print "a et b egaux")

(print (* a b)))

(if (/= a b)

(progn

(print "a et b differents")

(print (+ a b))

)

(progn

(print " e i est la lause else")

(print (- a b))

)

)

1.6.3 Bou les iteratives

Voi imaintenant les manieres de fairedes bou les:

 (loop (fa a) (fb a) (f a) ...)Cettefon tionestunebou lein nie. Elleexe ute

lasequen e (fa a) (fb a) (f a) ... jusqu'a equ'ilyaitinterruptiond'unefa on

ou d'uneautre. Generalement, on interrompt e type debou le enutilisantlafon tion

(return). Parexemple:

> (setf a 0)

0

> (loop

(print "Hello")

(setf a (1+ a))

(if (= a 3) (return "fin de bou le."))

(print "non, on ontinue!")

)

"Hello"

"non, on ontinue!"

"Hello"

"non, on ontinue!"

(24)

 (dotimes (a stop ret) (fa a) (fb a) (f a)...) Cette fon tion est une bou le

iterative. a part a zero et ontinue jusqu'a tempsqu'elle atteigne stopex lusivement.

La variable aest unevariable lo ale, e quisigni equ'elle n'est onnue qu'al'interieur

de la bou le. S'il y a un autre symbole a a l'exterieur de la bou le, sa valeur sera

onservee. A la n de la bou le, l'expression optionnelle ret est retournee. S'il n'y a

pas deret lavaleurretournee est NIL. Parexemple:

(dotimes (a 10 " 'est fini!")

(print a))

Cet exemple imprimerade0 a 9etretournera ommevaleur nale" 'est fini!".

 (dolist (sym liste ret) (fa a) (fb a) (f a) ...)

C'est unebou leiterative. Ellede omposelaliste\liste"elementparelement,qu'elle

assigne a sym. La variable liste est unevariable lo ale. Sa valeur n'est onnue qu'a

l'interieurdelabou le. Elleexe utele orpsdelabou leave sym ommevaleurjusqu'a

tempsquelaliste listesoitvide. Lavaleuroptionnelleretestretournee ala n. Par

exemple:

> (setf liste (list "un" "deux" "trois"))

("un" "deux" "trois")

> (dolist ( haine liste)

(print haine))

"un"

"deux"

"trois" NIL

>

1.7 Manipulation des hiers et impression

1.7.1 Manipulation des hiers

L'entree de parametres ou la sauvegarde des resultats requiert la manipulation de hiers

qu'ilfaut pouvoir lire ou e rire, e quidans la plupartdes langages n'estguere aise.

Xlisp-Stat n'e happe pas a la regle. Quelques fon tions elementaires et puissantes sont de rites

i-dessous. Commeenlangage C, onmanipuledespointeursde hiersquisont passesd'une

fon tionauneautre. Cespointeurssont appeles\streams".

 (open "file.txt")ouvrele hierdont lenomest \ le.txt". La fon tionretourneun

pointeursur e hierquipeut^etre ouverten le ture ouen e riture.

Parexemple:

(setf pointeur (open "file.txt" :dire tion :input)

ouvrele hier\ le.txt"en le ture et

(25)

xxii CHAPTER 1. UTILISATION DE L'INTERPRETEUR

 (read pointeur)retourne un objetlu dans le hier pointe quelle que soitsa nature

(entier, reel, ha^ne de ara teres, ...) et passe au suivant. Cette fon tion dete te le

type de l'objetluen utilisantlam^eme syntaxe quelafon tion(prin )( f. pagexix).

Ainsi, pourune ha^ne de ara teres, il faut qu'elle soit entre des guillemets (quotes).

C'est laprin ipalefon tion de le ture disponible. Contrairement a l'usage dans Xlisp,

la fon tionne renvoie pasNIL en asde n de hier maisun message d'erreur. Pour

obtenir NIL quandon arriveala ndu hier,ilfautdonner undeuxieme argument a

la fon tion,a savoir NIL. Lasyntaxe exa te estalors(read pointeur nil);

 (read-line pointeur)lituneligneentieredu hierpointeparpointeuretretourne

la ha^ne de ara teres orrespondant a ette ligne. L'interpretation de la ligne est a

harge de l'utilisateurave les fon tionsde manipulationde ha^nesde ara teres;

 ( lose pointeur) ferme le hierpointe parpointeur. Il est onseille de fermer un

hierapresusage.

L'exemplesuivant onstruituneliste ave tout e que ontient un repertoire:

; Cree un fi hier ontenant le resultat de ls

(system "ls > tmp_ls")

(setf file (open "tmp_ls" :dire tion :input))

; Initialisation d'une liste

(setf liste (list ))

; Bou le jusqu'a la fin du fi hier

(loop

(if (setf el (read-line file))

(setf liste (append liste (list el)))

(return)

)

(print liste)

)

Voi iun exemplequiouvreun hierettransfereson ontenu multipliepar2 dansunautre:

; Ouverture d'un fi hier en le ture et d'un autre en e riture

(setf input (open "input-file.txt" :dire tion :input))

(setf output (open "output-file.txt" :dire tion :output))

(loop

(if (setf number (read input nil))

(print (* number 2) output)

(return)

)

)

; Fermeture des fi hiers

(26)

1.7.2 Impression

Dans tous les langages, imprimerles resultats n'est pasune min ea aire. Xlisp ne fait pas

ex eptionalaregle. Cettese tionmontre ommentonpeutsedebrouillerpouravoirquelque

hose rapidement etsimplement.

Les fon tions de type PRINT

Cesfon tions impriment lesresultatssurle terminalou dansun hier.

 (print a out)imprimed'abordunretour hariotsuividelavaleurde a(Xlispfaisait

l'inverse). L'argument outest optionnel: 'est le pointeura un hier. S'il estabsent,

lafon tionimprimesurleterminal. Elleretournetoujourslavaleurdea. Parexemple:

(print "hello") imprimera la ha^ne de ara teres sur le terminal. A noter que les

ha^nesde ara teres sont entoureesde guillemets;

 (prin a out) imprimela valeur de a sans un retour de hariot. out est optionnel:

'est le pointeur a un hier. En son absen e, la fon tion imprime sur le terminal.

prin retournelavaleurde a. Parexemple: (prin "hello")imprimerala ha^ne de

ara teres surle terminal. La ha^ne ne serapas entouree de quotes;

 (prin1 a out)faitlam^eme hoseque(prin ),saufqueles ha^nesde ara teressont

entourees de quotes;

 (terpri destination)imprimeunretourde hariotsurladestination,quiest

option-nelle. S'ilellen'estpas spe i ee, 'estsur leterminal.

Lafon tion format

L'usagede ettefon tionestassez omplexe. Elleestegalement trespuissanteetpolyvalente:

on peutaussibien imprimersurun terminal quedans un hier, eton peutegalement reer

une ha^ne de ara teres a l'aide de ette fon tion.

Voi isa syntaxe:

(format destination formattage expr1 expr2 ... )

ou

 destinationestsoitunpointeuraun hier,soitTsionveutimprimersurleterminal,

soitNIL si onveut reer une ha^nede ara teres;

 formattage estune ha^ne de ara teres spe i ant le format;

 expr1 expr2 ... sont lesexpressions aimprimer.

Les dire tivesde formattage importantessont:

 A! : imprime la valeur de l'expression. Si 'est une ha^ne de ara teres, elle est

(27)

xxiv CHAPTER 1. UTILISATION DE L'INTERPRETEUR

 ! imprimeuntilde;

 ! seulala n d'uneligne, 'estun ara tere de ontinuation.

Unexempletypiquede e quenousavonsafaire entraitement d'images: sauvegarderdes

images (dans l'exemplesesontdes nombres)dansdes hiers numerotes de 0a 5.

(dotimes (i 6)

(setf out-name (format NIL "image~a.txt" i)) ; Cree le nom du fi hier

(setf out (open out-name :dire tion :output)) ; Ouvre le fi hier

(print i out) ; Imprime un nombre dans le fi hier (ou une autre a tion)

( lose out)

)

1.8 Fi hier s ript

Il peut ^etre interessant de onserver l'historique de toutes les instru tions Lisp que l'on a

entrees au lavier. Il existe dans Xlisp la fon tion dribble quipermet de de nirun hier

dans lequelseront enregistrees toutes les ommandes; e type de hiers'appelle un hier

\s ript".

Xlim3D ontient en pluslafon tiongetpidquiretourne lenumero dupro essusXlisp en

ours. Ce i permet de reer fa ilement des noms de hiers uniquespourles hiers s ript.

Il suÆt d'in lure dans le hier \init.lsp" la ommande suivante: (dribble (format nil

"s ript~a.lsp" (getpid))),utileseulementsil'ondesire onserverunetra edetoutesles

(28)

Les omposantes de Xlim3d

Pour desraisons historiques,le logi iel Xlim3Dresulte de lafusion de deux logi ielsXlimet

Xl3d, le premier etant reserve a la manipulation d'images bidimensionnelles ontrairement

au se ond. La prin ipale onsequen e de ette fusion est la oexisten e de deux stru tures

d'images. Lemanueldereferen eindiquea haquefoissilesargumentssontdesimages2Dou

3Dentre parentheses a ^ote du mot Des ription. L'importantefon tionquifait lepassage

entre les imagesest ImCopy.

Dans etteversiondeXlim3d,ons'est ontente defaire ommuniquerlesdeuxlogi iels

en-treeuxpourqu'ilspuissente hangerdesdonnees, 'est-a-dire desimages. Laprogrammation

en Lisp apporte un peu plusde souplesse au systeme. Ainsi, la fon tion (imxv imin)

per-metdevisualiserlesdeuxtypesd'images(voir le hier\Fondamental.lsp"). Onremarquera



egalement que, puisque Xl3d etait en mesure de traiter des images 2D, un bon nombre de

fon tionsa tuelles sont redondantes. Pour ouronnerle tout, deuxstru tures independantes

de graphe sont apparues dans le logi iel: l'une est adaptee aux grands graphes (elle tiree

de Xlim), l'autre est preferable pour des petits graphes (Xl3d). Bien qu'il soit preferable

d'uni erletype, en'estpastropg^enant par eque esdeuxgraphesdesserventdesobje tifs

di erents.

Les se tions suivantes de rivent les omposantes de Xlim3d. C'est un texte base sur les

rapportsdeC.Gratin,legerementadaptealanouvelleversiondulogi iel. Lapartie onsa ree

auxgraphesest lefruitdutravail de H.Talbot.

2.1 Les images

2.1.1 La stru ture d'image 2D

Lespixelsd'uneimage2Dsontde nissurunnombre xedebitsquidependde l'installation

(generalement 16bits). Ilyaussimoyende travaillerave desimagesdereelsmaisseulement

pourquelques fon tions( omme fft).

Un exemple de session ave des images 2D.

> (setf in (imread "images/ am.ras")) ; Lit une image d'entree

(29)

> (setf out (timmallo in)) ; Cree une image de sortie de meme taille

#<Foo: #f1608>

> (ero4 in out 2) ; Erosion en 4- onnexite de taille 2

#<Foo: #f1608>

> (imxv out) ; Visualisation

WRITE-RASTER: Writing raster image tmp28960.1: [256℄[256℄...

>

Si ette derniere instru tionn'estpasdisponible,il fautlan er

> (raster-write out "tmp_xlim.ras")

> (system "xv tmp_xlim.ras &")

2.1.2 La stru ture d'image 3D

La stru ture d'image 3D est elle quiest generee par une fon tion du pa kage 3D (ImGet,

ImGet2D ou ImGetSame). Ces images peuvent ^etre bi ou tridimensionnelles. Les images

bidimensionnellesne sont pas ompatibles ave e quia ete appele \stru ture d'image 2D",

par e qu'i i il y a ne essairement un bord. Les seules fon tions qui peuvent travailler ave

lesdeux typesd'image ( 'est-a-dire les stru tures d'image 2Det3D)sont lesinstru tions de

opie(ImCopy etImIsCopy).

Uneimage2Ddupa kage 3Dest de niedansleplan XZ(attention, 'estbienXZ etnon

XY), tandis que le premier plan d'une image 3D est XY. Cette implementation permet de

traiter laparite desimages 2D (tramehexagonale) et desimages 3D(trame ubique a fa es

entrees)ave lam^emestru tured'image. Que esoitleplanXZouXYn'apasd'importan e

qu'aumomentdelireuneimage. Signalonsqueleformat\visilog"admetdesimagestant2D

que 3D. Ainsinouspouvonsfaire

> (setf im2d (ImGet2D 256 256))

> (ImReadVisilog im2d filename)

etaussi

> (setf im3d (ImGet 256 256 10))

> (ImReadVisilog im3d filename)

Pour utiliserle format\raster",quiluinelitque desimages 2D,il faudrafaire

> (setf im2d (ImGet2D 256 256))

> (ImReadRaster im2d filename)

Mais les autres fon tions de le ture (ImReadAnyBitMap, ImReadText, ImReadAs ii)

n'a eptent quedesimages 3D.Dansun bitmap orrespondantauneimage3D,les premiers

pixels orrespondent au premier plan XY, tandis qu'une image 2D est vue omme un plan

XZ. Pour rendre les images 2D ompatibles ave les instru tions de le ture des images 3D,

(30)

> (setf im2d (ImGet2D 256 256))

> (ImSwapYZ im2d)

> (ImReadAnyBitMap im2d filename 256 256 20 0 0 0 0 256 256 1)

> (ImSwapYZ im2d)

Pour simpli er l'usage, nous avons de ni les fon tions ImReadAnyBitMap2D et

ImReadAs i2Ddontl'usage est:

> (setf im2d (ImGet2D 256 256))

> (ImReadAnyBitMap2D im2d filename 256 256 0 0 0 256 256)

> (ImReadAs ii2D im2d "im.as ")

Dans haque image estde nie unefen^etre a tive: 'est lapartie de lafen^etre sur laquelle

s'e e tue e e tivement le traitement. Elleest donnee par les oordonnees du premier point

de lafen^etre etparsestailles dansles troisdimensions.

Les images sont odees sur 8 bitsnon signes, 16 bitsnon signes ou 32 bitssignes. Mais

la plupart des fon tions sont e rites pour des images 8 bits. Il n'estdon pasassure qu'une

fon tion donnee soit appli able a une image 16 ou 32 bits. Un message d'erreur, sous la

forme Bad image type, appara^tra a haque fois que le type de l'image n'est pas supporte

par l'algorithme. Il n'existe pas a proprement parler d'images binaires. Une image binaire

sera simplementvue ommeuneimage8bitsdont lespixelsont desvaleurs nulles(i.e. pixel



eteint) ou nonnulles(i.e. pixelallume).

Certaines onventionsontete adoptees pourlesfon tions de traitement d'images,

notam-ment:

 toutes les fon tions de traitement d'images ont un nom qui ommen e par Im {nous

onseillons neanmoins d'utiliser une nomen lature ou il n'y aurait plus que I pour

indiquer qu'ils'agit d'une fon tions'appliquant auneimage;

 nous n'avons pas sur harge les operateurs existant ( omme par exemple add), e qui

aurait pu^etre unesolution;

 lesnombres orrespondantadesvaleursdepixelspasses ommeparametresouretournes

omme resultat sont toujours donnes sous forme de reels, m^eme s'ils s'appliquent a

des images entieres (parexemple retourneun nombrereel, etdans(ImSetConstant a

value)value doit^etre un reel).

Un exemple de session ave des images 3D.

> (setf n1 (ImGet2D 256 256)) ; Creation d'une image sour e

Image (256,1,256), unsigned har, a tive window [(0,0,0),(256,1,256)℄

> (setf n2 (ImGetSame n1)) ; Creation d'une autre image

Image (256,1,256), unsigned har, a tive window [(0,0,0),(256,1,256)℄

> (ImReadRaster n1 "images/ am.ras") ; Initialisation de l'image

Image (256,1,256), unsigned har, a tive window [(0,0,0),(256,1,256)℄

> (ImIsCopy n1 n2) ; Copie

Image (256,1,256), unsigned har, a tive window [(0,0,0),(256,1,256)℄

> (Imxv n2) ; Affi hage

(31)

2.2 Les graphes

2.2.1 Les graphes en tant que stru ture supplementaire

Dans ettese tion,nouspresentons equ'ilestne essairedesavoirpourpouvoirmanipulerles

graphesde nisau niveau du ompilateurC a n de omprendreleurutilisationetde pouvoir

developperdesfon tionspersonnelles. Pourunemeilleure omprehensionde equivasuivre,

ilpeut^etrebon de sereporteraux travauxde L.Vin ent [5, 6℄.

Introdu tionsurlesgraphes morphologiques. Pargraphemorphologique,nous

enten-dons unestru turereliant dessommets (\verti es"), qui orrespondent a despoints, pardes

ar^etes (\edges"), dont les sommetsou les ar^etes peuvent^etre values.

5

12

13

9

6

7

1

7

Figure 2.1: Exemplede graphe planaireauxsommetsetar^etes values.

La stru ture que nous allons de rire permet d'avoir des graphes planaires (dont au une

desar^etes ne se roisent) ou non, des graphes orientes ou non (A est relie a B mais Bn'est

pas relie a A), onnexes ou non, mais d'une maniere generale, les graphes que nous allons

onsidererseront planaires,nonorienteset onnexes. Vin ents'etaitlui-m^emelimiteaux as

desgraphesauxar^etesnonvaluees. Lamajoritedesoperationsquenous omptonsfairesubir

aux graphesne hangent pasleur stru ture de onnexite, mais seulement les valuations des

ar^etes etdes sommets. Les graphes morphologiques sont simplement onsideres omme des

imagesaniveauxdegrisauxproprietesde onnexitevariablesselonlelieu. Commel'amontre

Vin ent,les operations morphologiquessur les images sont egalement valables laplupart du

tempssur les graphes(erosion, dilatation,lignede partage deseaux,...). Lesimages ne sont

engeneral quedesgraphes auxproprietesde onnexitetres regulieres).

La stru turede grapheimplementee est lasuivante:

typedef stru t hgraph {

int id; /* graph kind */

(32)

VERTEX *verti es; /* array of verti es */

VALUE *values; /* valuation of the verti es */

int nb_edges; /* total number of non-oriented edges */

int *neighs; /* array of ba k-relation to verti es */

VALUE *edval; /* valuation of the edges */

} HGRAPH;

Voila omment ette stru turesede ompose:

 id estun entierquide rit a queltypede graphe on aa aire:

{ IDGR DELAUNAY (1) : triangulation deDelaunay;

{ IDGR GABRIEL (2): graphede Gabriel;

{ IDGR RNG (2) : graphe de voisinagerelatif.

D'autresidenti ationsdegraphe sontbiens^urpossibles: arbresde re ouvrement

min-imal,parexemple;

 field est une petite stru ture qui de rit les dimensionsd'une fen^etre ne essaire pour

ontenir legraphe;

 order estjuste lenombrede sommetsdu graphe;

 verti esestunsimpletableaudesommets. Lastru turedesommet ontientlaposition

de haque sommet dans la fen^etre, et un index dans neighs[℄ sur le premier de ses

voisins;

 valuesestunsimpletableaudem^emetaillequeverti es,et ontientlavaleur(niveau

de gris) de e sommet;

 nb edges est le nombre d'ar^etes du graphe (asymptotiquement 6 fois le nombre de

sommet dans le as de graphes (triangulation de Delaunay) rees a partir d'images

mosaque);

 neighs est un tableau d'assez grande taille. Il ontient des index de sommets dans

verti es, et permet de onna^tre les relations entre tous les sommets. Comme il est

de rit plushaut, haque stru ture de sommet ontient un indi e dans e tableau, qui

orrespond au premier de ses voisins. Les voisins suivant du sommet onsidere sont

ranges dans l'ordre roissant dans e tableau. Pour onna^tre l'ensemble des voisins

d'un sommet, il suÆt de regarder dans nb edges a partir de l'indexdans la stru ture

sommet du sommet en ours, jusqu'a l'index de dans la stru ture sommet du sommet

suivant. Lesindexren ontressont euxdesvoisinsdusommeten oursdansverti es.

La gure 2.2permetde mieux omprendre ette organisation;

 edval est un tableau de m^eme taille que neighs, et ontient les valuations des ar^etes

du graphe.

(33)

S1

S2

S3

S4

S5

S6

S7

S1 S2 S3 S4 S5 S6 S7

S1 S3 S5 S5 S4 S7 S6 S6

Sommets :

Pointeurs de sommets :

(34)

1. Elle estrelativement souple: ellepermetde sto ker aussibien les graphesorientes que

non, lesgraphes planairesou non,et ;

2. Elleest relativement simpled'a es: les voisinsd'unsommet s'obtiennent fa ilement;

3. Par ontre, elleestgourmandeenpla esurtoutdansle asdegraphesnonorientes,aux

ar^etes non values. Chaque ar^ete est immuablement notee deux fois: une fois omme

lienentre A etB,uneautrefois omme lienentre B et A;

4. De plus, ellen'estpas tres souplelorsqu'il s'agit d'ajouter ou d'enleverune ar^ete a un

graphe. De maniere interne, on aura inter^et a revenir a une stru ture basee sur des

listes ha^nees lorsqu'onvoudra traiter e genre deproblemes.

2.2.2 Les graphes relatifs a la partie 3D

Quand ondesireparlerde onnexite,onde nitungraphe: unreseau d'ar sreliantlespoints

de l'image entre eux. En reseau hexagonal, on pourra par exemple relier un point aux six

points les plus pro hes. En reseau arre, on le reliera tant^ot aux 4 points les plus pro hes

(4- onnexite),tant^otaux8pointslespluspro hes(8- onnexite). Ungrapheestde niparune

liste(l'objetlispien)deve teurs, 'est-a-direunelistedetripletsdevaleursreellesrepresentant

les oordonnees relatives(x,y,z) despointsreliesparun ar au point onsidere.

Une\parite" a ete introduitesur les plans(sur les lignes en 2D) de sorte que l'on puisse

travaillerenreseau ubiqueafa e entree(hexagonalen2D).Cettepariteappara^tauniveau

de lade nitiondu graphepuisqu'alorsles oordonnees relativesparrapportau point entral

peuvent^etre non entieres.

Exemple:

(def hexagonal6Gr '((-0.5 0.0 -1.0) (0.5 0.0 -1.0) (-1.0 0.0 0.0) (1.0 0.0

0.0) (-0.5 0.0 1.0) (0.5 0.0 1.0)))

Ce ide nitlessixvoisinsd'unpointenreseauhexagonal. Attention: remarquezque,puisqu'il

s'agit d'un graphe s'appliquant a une image 2D, la deuxieme oordonnee est toujours nulle

(et non paslatroisieme).

Un ertain nombre de graphes standard ont et e rees dans le hier \Graphs.lsp":

square4Gr (de ni dans le plan XZ), square4XYGr (de ni dans le plan XY), square8Gr

(de nidansle planXZ),square8XYGr(de nidansleplan XY),hexagonal6Gr, ubi 6Gr,

ubi 26Gr, f 12Gr. Cesvariables pourront^etre utilisees omme parametres d'un ertain

nombrede fon tions Lisp( omme ImMinima, ImFillHoles, ImWatershed...).

ATTENTION:les ve teurs de nissant ungraphe NE DOIVENT PAS posseder de

o-ordonnee stri tement superieure a 1 en valeurabsolue. La raison en est que les

algo-rithmes ne font au un test de presen e des points dans l'image. Pourquoi 1 ? Car

toutes les images possedent un bord supplementaire de 1 pixel (qui n'appara^t qu'au

niveau de la programmation en C). Si les oordonnees depassent 1 vous devrez alors

travailler sur une sous-image de vos images en utilisant les fon tions ImSetWindow et

(35)

2.3 Noyaux de points

On utilisera aussi dans les fon tions de Xlim3D une stru ture appelee noyau (Kernel) qui

est en fait identique a la stru turegraphe { 'est uneliste de ve teurs{ mais dont ler^ole est

di erent. Onde nira un noyau K par exemplepourdeterminer la moyenne, lamediane, ou

bien en orelapluspetitedesvaleursd'uneimagesurK. A ladi eren edu graphe,lenoyau

pourra ontenirleve teur nul.

Exemple:

(def hexagonK '((-0.5 0.0 -1.0) (0.5 0.0 -1.0) (-1.0 0.0 0.0) (0.0 0.0 0.0)

(1.0 0.0 0.0) (-0.5 0.0 1.0) (0.5 0.0 1.0)))

Un ertainnombredenoyauxstandardontete reesdansle hier\Kernels.lsp":diamondK

(de ni dansleplan XZ), diamondXYK(de ni dans leplanXY), squareK(de nidans leplan

XZ),squareXYK(de nidansleplanXY),hexagonK, o taedronK, ubeK, ubo taedronK.

Cesvariablespourront^etreutilisees ommeparametresd'un ertainnombredefon tionsLisp

( omme ImMean, ImInfKernel, ImConvolve...).

Commedansle asdes graphes,si les oordonnees depassent 1,vous devreztravaillersur

unesousimagedevosimages enutilisantlesfon tionsImSetWindowetImSetGlobalWindow.

La gestion des bords risqueen ore de ne pas ^etre assuree onvenablement. Pruden e don ,

unefois en ore.

2.4 Les elements stru turants

Leselementsstru turantssontimplantessouslaformed'objets. Ilspeuvent^etredeplusieurs

formes:

1. de ompose omme sommed'elementsstru turantselementaires, 'est-a-dire d'elements

stru turantsde nis surun voisinage de taille1. Un telelement stru turant B (appele

\Steiner") s'e rit: B =B 1 B 2 :::B n

2. homothetique d'un element stru turant onvexe elementaire. C'est un as parti ulier

du aspre edent:

B n

=BB:::B

3. quel onque,de ni sous laformed'uneimage.

Cesdistin tionssont d'originete hnique: onn'utilisepaslem^eme algorithmeselonqu'un



element stru turant peut^etre de ompose ou pas,pourdesquestions de vitessede al ul.

Ilexiste4 lassesd'elements stru turants:

 La lassedebaseestla lasseSElement. L'implantationdel'elementstru turantn'est

pas onnue. Elle sert simplement de lasse-mere aux lasses qui vont suivre. Elle ne

possedeni hamp dedonneesnimethode;

 De omposedSE, sous- lasse de la lasse SElement, est la lasse des element

(36)

 Homoteti SE,sous- lassedeDe omposedSE, orrespondauxelementsstru turantsdu

as 2. Un element stru turant est alors de ni par la donnee d'un noyau de points

(Kernel) etd'une taille;

 En nImageSE,sous- lassedeSElement,estune lassed'elementsstru turantsapriori

quel onques. Ilssont de nisparuneimage.

Un ertain nombre d'instan es de la lasse Homoteti SE ont ete reees ( hier

\SE-lements.lsp"). Elles orrespondent aux boules de base asso iees aux di erents graphes:

diamondSE(de nidansleplanXZ),diamondXYSE(de nidansleplanXY), squareSE(de ni

dansle plan XZ), squareXYSE (de ni dans le plan XY), hexagonSE, o taedronSE, ubeSE,

ubo taedronSE. Cesinstan es ont ete initialiseesave unetailleegale a 1. Cette taille

(37)
(38)

Developpement de programmes

Ledeveloppementdenouvellesfon tionspeuts'e e tuersoitauniveaude l'interpreteur,soit

auniveaudu langage ompilesuivantletype defon tionsa realiser. Resteasavoir omment

debogger un programme ou ajouter une fon tion a une librairie. Nous allons de rire des

solutionspour e typede problemespourles deux niveaux.

3.1 Developpement de programmes Lisp

3.1.1 Ajout d'une fon tion

Pourqu'ellesoitutilisableauniveau Lisp,unefon tiondoit^etre de nieen suivantun

proto-typeparti ulier:

(defun nom (arguments) "Aide en ligne" ( orps de la fon tion))

Passons enrevueles di erentes omposantes du prototype:

 nom. Le nom de la fon tion s'e rit en un mot. Il peut ^etre quel onque mais il est

onseille de \ alquer"la nomen lature existante. Nousmettons aussien garde les

pro-grammeurs quirede nissent des fon tions existantes; e n'est pas unebonne fa on de

faire. Pouravoirunelistedesfon tionsfournies, onsultezl'indexdesfon tions ala n

de e do ument;

 arguments. Lade nitiondesargumentsestassez omplexe arilyamoyendede nir

des arguments optionnels et variables (&optional, &rest), ainsi que d'introduire des

les(&key) danslade nitionou en orede limiterledomaine devalidite d'unevariable

par &aux. Avant de passer a l'examen de l'usage de es mots, il onvient de pre iser

le domaine d'existen e d'une variable. Les arguments qui ne sont pre edes d'au un

mot- lef sont opiesdans esvariables(muettes)au momentd'entrer dansla fon tion.

Les arguments de lares dans le prototype seront lo aux a la fon tion. Si on utilise

des arguments quine sont pas de lares dans la fon tion, ils seront onsideres omme

globaux. Exemple:

> (setf x 10) ; La variable x est mise a 10

(39)

xxxvi CHAPTER 3. DEVELOPPEMENT DE PROGRAMMES

F ; (et y a 4)

> (f x) ; On tente de modifier x

5

> x ; La valeur de x n'a pas hange

10

Par ontre, le r^ole de (setf y 4) est moins lair. Comme telle l'instru tion va

af-fe ter lavaleurd'unevariable quiauraitexiste pre edemment. Poureviter et e et de

debordement,ilfaututiliserlemot&auxdanslade nitiondelafon tion. Voi iquelques

lignes d'illustration:

> (setf y 10)

10

> (defun f (x &aux y) (setf y 4) (setf x 5)) ; Noter la presen e

F ; de &aux

> (f 5)

5

> y

10 ; La variable globale y n'est plus modifiee

>

On pla e generalement &aux a la n des arguments. Signalons une erreur frequente:

&auxlimitel'existen ed'unevariablealafon tionmaisneliberepasun blo dedonnee

qui luiest atta he. Ainsi, si y etait une image, le nud y serait libere a la n mais

pas la zone de memoire ontenant les pixels. Pour remedier a ela, il faudra liberer

expli itementlazonedememoiredesimages (parexempleave imfree)avantde sortir

de lafon tions sinonon serarapidementa ours de memoire.

Le mot &rest prend tous les arguments restants. Voi i un exemple d'utilisation qui

de nituneaddition ave unnombrequel onque d'arguments:

> (defun add (x &rest y) ; y est une liste ave tous les arguments

(loop

(if (null y) (return))

(setf x (+ x (first y)))

(setf y (rest y))

) x ) ADD > (add 4) 4 > (add 4 5 68) 77 >

(40)

de l'argument qui lui est atta he. Cet argument vaut NIL par defaut. Si on veut

modi er ette valeur pardefaut, on pla e l'argument ave la valeurentre parentheses.

L'implementation de la fon tion fa torielle sous forme re ursive illustre le

fon tion-nement:

> (defun fa toriel (n &optional imp) ; imp dit s'il faut affi her

(if imp (format T "n = ~a\n" n)) ; les resultats intermediaires

(if (= n 0) 1 (* (fa toriel (- n 1) imp) n)))

FACTORIEL > (fa toriel 3) 6 > (fa toriel 3 T) n = 3 n = 2 n = 1 n = 0 6 >

Pourimprimerpardefaut, on rempla elapremiere lignepar

> (defun fa toriel (n &optional (imp T)) ; imp dit s'il faut affi her

Comment faire lorsqu'on a plusieursarguments optionnels? On peut re ourir au mot

&key. La syntaxe de de nition est pro he de elle de &optional; seule la maniere de

mettre en uvre lavariable di ere.

> (defun 5+ (x &key imp (ajouter 5)) ; Definit deux arguments

(if imp (+ x ajouter))) ; optionnels. Par defaut, imp

5+ ; vaut NIL et ajouter vaut 5.

> (5+ 10)

NIL

> (5+ 10 :imp T)

15

> (5+ 10 :imp T :ajouter 5.1) ; On a modifie la valeur par defaut

15.1

>

Nous onseillons vivement l'usage du mot &key au lieu de &optional ou de

&rest;

 aide en ligne. Il s'agit d'une ha^ne de ara teres qui appara^t lorsqu'on lan e la

ommande (help 'nom). La manierehabituelle d'e rire l'aide est

"Args: (x y)

Voi i e que fait la fon tion."

(41)

xxxviii CHAPTER 3. DEVELOPPEMENT DE PROGRAMMES

3.1.2 Chargement de hiers

La fon tion pour harger des hiers Xlisp est (load "fi hier"). Le hier, quidoit

obli-gatoirement se terminer par \.lsp", sera alors lu et interprete exa tement omme s'il avait



ete tape au terminal. L'extensionpardefaut est.lsp. Sitoutsederoule bien,l'interpreteur

retourne lavaleurT.

3.1.3 Deboggage

Troisoutilsde deboggagesontdisponiblesdansl'interpreteur: l'arr^eten oursd'exe ution,le

tra age des argumentset l'exe utionpas a pas. La plupartdes langagesLisples fournissent

mais leur omportement di ere sensiblement d'un systeme a une autre. La des ription

en-tamee i iestproprea Xlisp-Stat.

Arr^ets lors de l'exe ution

Lemoyenleplussimpled'interromprel'exe utionestl'utilisationdelafon tionbreak. Pla er

l'instru tional'interieurdu orps d'unefon tionpermetd'examinerle ontenudesvariables.

Le programmesepoursuitdesque l'on tape ( ontinue). Voi iun exemple:

> (defun fon tion (x) (setf x (+ x 5)) (break) x)

FONCTION

> (fon tion 10)

break: **BREAK**

if ontinued: return from BREAK

1> x

15

1> ( ontinue)

[ ontinue from break loop ℄

15

Le nombrequi appara^t a gau he de \>" indiquele niveau dans lequela lieul'interruption.

break a epte une ha^ne de ara teres omme argument optionnel. Dans e as, la ha^ne

appara^tralorsde l'arr^et.

Lesysteme generera un arr^et detype breaklorsd'uneerreura l'exe ution, m^emesi ette

instru tionn'est paspla ee dansle ode, a onditionquelavariable globale*breakenable*

nevaillepasnil. Ilen va dem^eme pourlavariable *tra enable*quiimposeral'impression

d'une\tra e" desappels ayant pre ede l'interruption. baktra epermetd'imprimerles

mes-sagessi*tra enable*vautnilmalgretout. Les ommandes(debug)et(nodebug)

perme-ttent de bas ulerplusaisement lavaleurde lavariable*breakenable*.

Tra er une fon tion

Typiquement, un programme plante par e que des mauvais arguments lui ont ete fournis.

Lorsqu'ilestplantequelquepart,ilindiquedanslepromptlenumeroduniveaudedeboggage.

(42)

> (debug) ; Initialisation du mode de deboggage

T

> (defun aire (r) ; Une fon tion qui al ule l'aire d'un disque

(* r r 3.14))

AIRE

> (aire "foo") ; On donne un mauvais type d'argument

error: not a number - "foo"

1> (baktra e) Fun tion: #<Subr-BAKTRACE: #b92f8> Fun tion: #<Subr-*: #d0870> Arguments: "foo" "foo" 3.14

Fun tion: #<Closure-AIRE: #1a3190>

Arguments:

"foo"

NIL

1>

Ilfaut unpeud'experien e pourde hi rerde telsmessages.

Ilestpossibleau ours del'exe utiond'utiliserunefon tionquimontrelatra edesappels

de fon tion. Cettefon tions'appelle(tra e fn)etelledonnelalistedesargumentsquisont

soumisa lafon tionfn. Un exemple:

> (tra e aire) ; On veut tra er la fon tion aire.

(AIRE)

> (aire 1 2 3 4)

Entering: AIRE, Argument list: (1 2 3 4)

error: too many arguments

1>

Poursupprimerunefon tiondela\tra e",ilfautfaire(untra e fn). Lafon tionfnsera

supprimeede lalistedesfon tions atra er. Cesdeux fon tionssont tresutilespourlo aliser

les problemes.

Exe ution pas a pas

Comme dans gdb, Xlisp-Stat pretend pouvoir observer le deroulement du programme pas a

pasau moyen de l'instru tionstep. Ce modede fon tionnementsemblereserve aMa intosh

ar ilne mar he pasdansla versiona tuellede l'interpreteur.

Niveaux de deboggage

Ilyadesniveauxenmodedebug. Ilfautetre^ apablederevenira unniveauanterieur. Cela

se fait au moyen de deux fon tions: ( lean-up)(qui remonted'un niveau)et(top-level)

(43)

xl CHAPTER 3. DEVELOPPEMENT DE PROGRAMMES

T

> (+ "foo" "ree")

error: not a number - "foo"

1> foo

error: unbound variable - FOO

if ontinued: try evaluating symbol again

2> ( lean-up)

[ ba k to previous break level ℄

1> ree

error: unbound variable - REE

if ontinued: try evaluating symbol again

2> (top-level)

[ ba k to top level ℄

>

Quelques subtilites du systeme

La memoire est quelque hose de ritique en Lisp. On en manque toujours. Voi i quelques

fon tions pourlagerer.

UninterpreteurLispadesstru turesqu'onappelle\nuds". Cesnudsserventasto ker

leselements des listes et a les oller ensemble. Au ours des manipulations,les nudssont

frequemment deliesetseretrouvent dansleslimbes: iln'estpluspossibledeles trouverpour

lesre-utiliser. Unefon tionpourramasser esnuds\de hets" s'appelleun \garbage

olle -tor". Ilyaeuunequantite onsiderabledere her hespouroptimiser e garbage olle tor,et

leslispiensensont ers. Parailleurs,lefaitd'examinertouslesnudsexistantspourtrouver

eux quisont libres prend du temps quipourrait^etre onsa re au al ul. La fon tion pour

for erla olle te desde hetsest (g ). Elleestfrequemment invoqueeautomatiquement. En

e et, haque fois queXlispmanquede memoire,il faitappela ette fon tion. S'il ontinue a

en manquer,il faudra qu'ilen demandeau systeme d'exploitation. Ce iest fait par la

fon -tion(expand n) ou nestle nombre de paquetsde nudsqu'ildemandera. Habituellement,

un paquet de nuds omprend approximativement 1000 nuds. Cette fon tion est appelee

automatiquement, maison peutlefaireaussimanuellement.

Onpeutvoirles statistiquesde memoire deXlisp en faisantla fon tion(room).

Uneautre fon tionquin'estpas portable etquin'a puentrer dansles ategories de

fon -tionsde rites dans e rapport: la fon tion(system " ommande") qui exe ute la ommande

demandee. Cette ommande dependevidemment despossibilitesdu systeme d'exploitation.

3.2 Developpement de librairies ompilees

3.2.1 Ajout d'une fon tion

Ajouter une fon tion d'une librairie ompilee n'est pas aussi simple qu'au niveau Lisp. En

plus de la de nition du niveau Lisp, il faut lier la fon tion de sorte que l'interpreteur aille

Figure

tableau en sp eiant son num ero. L'indie du premier  el ement est z ero. Les tableaux, omme
Figure 2.1: Exemple de graphe planaire aux sommets et ar^ etes valu es.
Figure 2.2: Codage par sommets. Chaque sommet pointe vers ses voisins stok es dans un

Références

Documents relatifs

Tout groupe d’ordre 80 n’admet-il qu’un seul 5-sous-groupe de

Donner sans justifier un isomorphisme d’anneaux entre Q[i] et le corps des fractions de Z[i].. Donner un polynˆ ome irr´ eductible sur Q qui est r´ eductible

Supposons que G soit un groupe fini d’ordre une puissance d’un nombre premier p.. Supposons que l’ensemble X soit fini et de cardinal premier `

Observons que chaque classe est non vide ; que deux classes sont disjointes ou confondues ; et que la r´eunion de toutes les classes est E.. Dans cette situation, nous dirons que

[r]

Le but de cet exercice est donc de rechercher s’il existe une position du point T sur le segment [EM] pour laquelle l’angle ATB est maximum et, si c’est le cas, de d´ [ eterminer

On glisse la petite étiquette dans le petit sac en plastique qui conserve le masque jusqu’au

Q 1.1 Ecrivez une fonction RechSeq qui, ´ etant donn´ ee une plage de cellules et un ´ el´ ement x, retourne vrai si x est pr´ esent dans la plage, et faux sinon.. On cherche `