Rapport

Transcription

Rapport
Institut Supérieur
d’Informatique de
Modélisation et de
leurs Applications
Complexe des Cézeaux
63173 Aubière Cedex
France
Projet de 2ème année
Option : Calcul et Modélisation Scientifiques
Interface graphique MATLAB
de génération de surfaces pour le maillage 2D
Présenté par :
Chef de projet :
Guillaume BOUSQUET
Caroline FRITEYRE
Jonas KOKO
Soutenance :
lundi 23 mars 2009
Remerciements
Nous tenons à remercier M. Jonas KOKO pour sa disponibilité et son aide durant la conception de
projet. Nous remercions aussi Mme Murielle MOUZAT pour son aide quant à la rédaction de ce rapport.
Table des figures
1.1
1.2
1.3
1.4
1.5
Exemple d’un maillage triangulaire . . . . .
Exemple d’utilisation de MATLAB . . . . .
Création d’une nouvelle interface graphique
Réglage des paramètres de composants . . .
Génération automatique du fichier .m . . .
2.1
2.2
2.3
2.4
2.5
2.6
Interface graphique de résolution d’un système matriciel . . . . .
Interface graphique permettant de tracer une fonction entre deux
Déplacement du curseur sur le cadre pour sélectionner un point .
Interface finale pour la définition de surface . . . . . . . . . . . .
Représentation de la surface définie par l’utilisateur . . . . . . .
Enregistrement de la surface définie par l’utilisateur . . . . . . .
3
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2
3
4
5
5
. . . .
bornes
. . . .
. . . .
. . . .
. . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
9
10
12
15
15
16
Résumé
Le logiciel MATLAB possède une interface nommée PDETOOL permettant de créer des surfaces
dans le cadre de résolution de problèmes d’équations aux dérivées partielles. Pour complèter la résolution,
le logiciel propose aussi des fonctions permettant de mailler ces surfaces. Toutefois, le maillage du logiciel
est assez sommaire donc peu précis dans le cadre d’études mathématiques approfondies.
Notre travail a consisté à créer une interface graphique pouvant générer des surfaces à deux
dimensions à partir du langage de programmation MATLAB. Cette interface a pour but de fournir à
l’utilisateur un ensemble de points dans un fichier de type .dat lui permettant de regénérer la surface et
de lui appliquer d’autres maillages que celui proposé par le logiciel.
A partir du logiciel GUI fourni par MATLAB, nous avons créé plusieurs interfaces dont la principale
répond au problème posé. Nous avons procédé par étapes afin d’améliorer à chaque interface la facilité
d’utilisation et la gestion des erreurs. Seule l’interface finale a été optimisée pour l’utilisation. Nous
nous sommes servis uniquement du langage de programmation MATLAB et des cours de géométrie et
d’analyse numérique pour résoudre les problèmes mathématiques de ce projet.
Mots clefs : MATLAB, maillage, surface, ellipse, rectangle, GUI.
Abstract
The software package MATLAB provides an interface named PDETOOL which enables the
user to create surfaces for the resolution of partial differential equations. To complete the resolution,
MATLAB also proposes function enabling to mesh those surfaces. However, the meshing of the software
package is basic, so little precise for applied mathematical studies.
Our work consisted in creating a graphical interface which can generate 2-D surfaces from the
programming language MATLAB. With this interface, the user can define a set of points in a file of type
.dat which enables him to generate the surface again et apply to it other meshings than the one included
in the software package.
From the software package GUI provided by MATLAB, we have created several interfaces, the main
one of which answers the given problem. We have proceeded by steps so as to improve each time the
ease of use and the ruling of the errors. Only the final interface has been optimized for use. We used
the programming language MATLAB and courses of Geometry and Numerical Analysis to solve the
problems of this project.
Keywords: MATLAB, mesh, surface, ellipse, rectangle, GUI.
Table des matières
Remerciements
Table des figures
Résumé
Abstract
Table des matières
Glossaire
Introduction
1 Objectifs et outils
1.1 Le maillage en mathématiques .
1.2 MATLAB . . . . . . . . . . . . .
1.3 Problématique et objectifs . . . .
1.4 Outils utilisés . . . . . . . . . . .
1.4.1 L’interface graphique sous
1.4.2 Rectangles et ellipses . . .
1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2
2
2
3
4
4
6
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
8
8
8
9
10
10
11
11
12
12
13
14
3 Résultats et discussions
3.1 Problèmes rencontrés et limites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2 Améliorations possibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
17
18
Conclusion
19
. . . . . .
. . . . . .
. . . . . .
. . . . . .
MATLAB
. . . . . .
2 Conception de l’interface graphique 2-D
2.1 La résolution matricielle . . . . . . . . .
2.1.1 Théorie mathématique . . . . . .
2.1.2 Interface mise en place . . . . . .
2.2 La lecture de fonction . . . . . . . . . .
2.2.1 Lecture d’une fonction saisie . .
2.2.2 Représentation graphique . . . .
2.3 La lecture de surface . . . . . . . . . . .
2.3.1 La fonction ginput . . . . . . . .
2.3.2 La saisie de coordonnées . . . . .
2.3.3 La définition de la surface . . . .
2.3.4 L’interface finale . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Bibliographie
ANNEXES
A Extraits du code source de la lecture et de la représentation graphique d’une fonction
B Extraits du code source de l’interface de définition de surface
5
I
III
Glossaire
Surface : Une surface désigne une couche fermée d’un objet, la surface est utilisée pour sa propriété
d’être fermée, donc d’aire finie.
Déterminant : Notion d’algèbre permettant le calcul de plusieurs objets mathématiques comme
les valeurs propres et servant à la résolution de systèmes d’équations linéaires.
Interface Graphique : Partie visible d’un logiciel dont se sert l’utilisateur.
GUI : De l’anglais Graphical User Interface, programme lié à MATLAB permettant la génération d’interface graphique pour les fonctions développées avec le langage MATLAB.
Introduction
Le maillage est une technique mathématique ayant pour but de modéliser des
conditions réelles appliquées à des objets virtuels. Par exemple, dans la construction d’un
avion, une longue phase de calculs informatiques modélisant la résistance de l’avion à
l’air est nécessaire pour construire un prototype dont on est sûr qu’il volera correctement
dès son lancement. Dans ce genre de cas, le maillage sert à décomposer la surface de
l’avion où va s’écouler l’air afin de pouvoir étudier cet écoulement le plus précisément
possible sur chaque petite partie de la carlingue.
Il existe de multiples techniques de maillages. Mais le logiciel MATLAB n’en possède
qu’une dans son catalogue de fonctions. Or, celle-ci s’avère être plutôt sommaire car
composée uniquement de triangles. M. Jonas KOKO a fait développer de nouvelles
fonctions permettant un maillage plus précis des surfaces considérées. Toutefois, il s’avère
qu’il n’existe aucun programme interne au logiciel MATLAB permettant de réaliser
des surfaces et de les enregistrer pour pouvoir les appliquer aux nouvelles fonctions de
maillage.
Pour résoudre ce problème, M. KOKO nous a proposé de réaliser une interface
graphique permettant la création de surfaces à partir de formes simples comme les ellipses
et les rectangles, puis la modification de ces surfaces et enfin leurs enregistrements. Notre
projet a donc consisté à créer cette interface.
Nous détaillerons dans un premier temps les outils que nous avons utilisés pour ce
projet, ainsi que les objectifs précis que nous avons voulu atteindre, puis nous nous intéresserons aux différentes versions d’interfaces que nous avons créées, et principalement
sur l’interface répondant au problème posé. Enfin, nous verrons quels sont les principaux
problèmes auxquels nous avons été confrontés, les limites de notre interface et les options
possibles d’évolutions.
Guillaume BOUSQUET et Caroline FRITEYRE
1
Chapitre 1
Objectifs et outils
1.1
Le maillage en mathématiques
En mathématiques, le maillage est la discrétisation spatiale d’un milieu continu, ou
aussi la modélisation géométrique d’un domaine aux éléments proportionnés fini et bien
défini.
Fig. 1.1: Exemple d’un maillage triangulaire
Le but du maillage est de permettre à celui qui l’utilise de résoudre un problème de
type Méthode des Eléments Finis pour résoudre des Equations aux Dérivées Partielles.
Pour cela, l’utilisateur se sert d’un maillage qu’il choisit afin de découper le domaine en
un nombre fini de composantes géométriques (triangles, carrés...) dont les propriétés
mathématiques sont connues par l’utilisateur. Ainsi, l’utilisateur n’a plus qu’à s’occuper
de résoudre le problème posé pour un nombre fini de surfaces simples pour obtenir la
résolution finale du problème posé.
1.2
MATLAB
MATLAB est un nom désignant à la fois un langage de programmation et un
environnement de développement, qui a été développé et commercialisé par l’entreprise
américaine The MathWork. MATLAB est très utilisé à la fois dans la recherche et
Guillaume BOUSQUET et Caroline FRITEYRE
2
Chapitre 1. Objectifs et outils
l’industrie, mais aussi dans l’éducation, les calculs numériques et le développement de
projets.
Fig. 1.2: Exemple d’utilisation de MATLAB
Le langage MATLAB permet de modéliser et de résoudre des problèmes mathématiques complexes que de simples calculatrices ne peuvent résoudre. La dernière version
développée par la compagnie est la 7.08. Ce logiciel est très utilisé dans le milieu
ingénieur par sa facilité de prise en main, son interface graphique très bien construite et
son environnement interactif. Avec MATLAB, on peut aussi bien résoudre des problèmes
de mathématiques abstraites, que modéliser des phénomènes physiques bien particuliers.
Par exemple, MATLAB est un logiciel très utilisé dans l’industrie aéronautique pour
modéliser des souffleries afin de tester les avions.
1.3
Problématique et objectifs
Le logiciel MATLAB dispose d’un système de maillage à deux dimensions de type
triangulaire. Toutefois, ce maillage est assez sommaire et il n’est pas possible d’utiliser
d’autres maillages, souvent plus complexes et surtout plus précis dans les calculs.
Le but de ce projet est donc de résoudre le problème suivant : peut-on créer une
interface graphique permettant de modéliser des surfaces en deux dimensions, pour
ensuite pouvoir mailler ces mêmes surfaces ?
Notre tuteur de projet, M. Jonas KOKO, a déjà en sa possession des fonctions permettant des maillages plus précis des surfaces. Nous avons donc concentré notre travail
sur la création de la surface permettant la création, puis la récupération de surfaces auxiliaires afin que celles-ci puissent être maillées. Pour cela, nous avons procédé par étapes.
Guillaume BOUSQUET et Caroline FRITEYRE
3
Chapitre 1. Objectifs et outils
Tout d’abord en réalisant une interface pour la résolution matricielle de problème (voir
figure 2.1). Puis pour l’affichage de fonctions (voir figure 2.2). Enfin pour l’affichage, la
modification et l’enregistrement des surfaces (voir figure 2.4).
1.4
1.4.1
Outils utilisés
L’interface graphique sous MATLAB
Création du fichier .f ig
MATLAB possède l’outil GUIDE, qui permet de créer facilement des interfaces
graphiques. Il suffit pour cela de taper dans la ligne de commande de MATLAB guide
et on a alors accès à ses différentes fonctions. On peut entre autres créer une interface
graphique à partir de modèles déjà existants, d’interfaces sauvegardées ou en créer depuis
le début, ce que nous avons fait.
Pour chaque nouvelle interface créée, nous avons dû réfléchir aux différentes composantes dont nous avions besoin (champs d’affichage simples, champs où l’utilisateur
peut écrire, boutons, panneaux d’affichage, etc) et les mettre en place en les sélectionnant
dans la liste de composants située à gauche de la fenêtre et en déplaçant sur l’interface à
créer (voir figure 1.3).
Fig. 1.3: Création d’une nouvelle interface graphique
Une fois tous les composants mis en place, il a fallu leur définir des valeurs par défaut.
Par exemple, pour les champs où l’utilisateur peut entrer des données, il a fallu indiquer
ce qu’ils affichent au départ, lorsque l’utilisateur n’a encore rien entré. On peut également
choisir, entre autres, la taille, la couleur et la position d’un composant donné.
Enfin, on sauvegarde le tout en un fichier avec l’extension .f ig.
Guillaume BOUSQUET et Caroline FRITEYRE
4
Chapitre 1. Objectifs et outils
Fig. 1.4: Réglage des paramètres de composants
Création du fichier .m correspondant
Une fois les différents composants de l’interface graphique mis en place, il faut
les faire interagir, c’est-à-dire, programmer l’interface graphique. GUIDE permet la
génération automatique d’un fichier .m correspondant à un fichier .f ig. Celui-ci contient
notamment une fonction s’exécutant au lancement du programme et les appels aux
différents composants.
Fig. 1.5: Génération automatique du fichier .m
Le principal de notre travail a consisté à écrire les fonctions de rétroaction relatives aux
boutons, c’est-à-dire les instructions à exécuter lorsque l’utilisateur clique sur un bouton
donné.
Guillaume BOUSQUET et Caroline FRITEYRE
5
Chapitre 1. Objectifs et outils
1.4.2
Rectangles et ellipses
Détermination d’une ellipse
Afin de définir une ellipse, deux méthodes différentes ont été mises en oeuvre :
• la première consiste en la saisie de trois points dont le premier est considéré comme
le centre,
• la seconde nécessite la détermination du rectangle englobant.
On rappelle que l’équation d’une ellipse en coordonnées cartésiennes est la suivante :
(x − x0 )2 (y − y0 )2
+
=1
a2
b2
(1.1)
où
• (x0 , y0 ) est le centre de l’ellipse,
• a, le demi-grand axe,
• b, le demi-petit axe.
Détermination d’une ellipse à partir de trois points
Il est possible de définir une ellipse à partir de trois points. On considère que le premier
point (x0 , y0 ) est le centre de l’ellipse et que les deux autres points (x1 , y1 ) et (x2 , y2 ) se
situent sur le contour de l’ellipse. On cherche alors à déterminer son demi-grand axe a et
son demi-petit axe b. On obtient, d’après l’équation 1.1, le système suivant :
( (x −x )2
1
0
a2
(x2 −x0 )2
a2
+
+
(y1 −y0 )2
b2
(y2 −y0 )2
b2
=1
=1
que l’on peut réécrire sous la forme Au = v avec
A=
(x1 − x0 )2 (y1 − y0 )2
(x2 − x0 )2 (y2 − y0 )2
!
, u=
a0
b0
!
et v =
1
1
!
avec
a0 =
1
1
et b0 = 2
2
a
b
Deux cas se présentent alors :
• Si la matrice A n’est pas inversible, il est alors impossible de déterminer une conique.
• Sinon, il est possible de trouver le vecteur u, solution de l’équation initiale Au = v.
On doit alors trouver les valeurs de a et b. Ceci n’est possible que si les composantes
a0 et b0 du vecteur u sont toutes les deux strictement positives. (Dans le cas contraire,
on pourrait déterminer une hyperbole.) On obtient alors
1
1
a= √
et b = √
a02
b02
Guillaume BOUSQUET et Caroline FRITEYRE
6
Chapitre 1. Objectifs et outils
Détermination d’une ellipse à partir de deux points
Une autre méthode consiste à définir le rectangle englobant de l’ellipse. Pour définir
un rectangle, on se donne deux sommets opposés de coordonnées (x1 , y1 ) et (x2 , y2 ). On
obtient alors facilement la longueur (horizontale) L = |x1 − x2 | et la hauteur (verticale)
H = |y1 − y2 |.
Fonction rectangle
Afin de tracer des rectangles et des ellipses, nous avons fait appel à la fonction
rectangle dont le prototype est le suivant :
(’Position’,[x,y,l,h],’Curvature’,[cx,cy],’LineWidth’,e,’LineStyle’,’-’)
où
• x et y définissent les coordonnées du point inférieur gauche
• l et h définissent les longueurs selon les axes respectifs des abscisses et des ordonnées
• cx = cy = 0 pour un rectangle et cx = cy = 1 pour une ellipse
• e désigne l’épaisseur du trait
• 0 −0 indique que l’on veut un contour continu
Guillaume BOUSQUET et Caroline FRITEYRE
7
Chapitre 2
Conception de l’interface graphique
2-D
2.1
2.1.1
La résolution matricielle
Théorie mathématique
La résolution matricielle d’un problème consiste tout d’abord à réécrire le problème
sous la forme d’un système matriciel afin de pouvoir s’inscrire dans la théorie d’Analyse
Numérique Matricielle. Cette forme est la suivante :



a1,1 . . . a1,p
 .

.. 


Ax=B avec A =  ..
. 
, x = 
an,1 . . . an,p


x1

.. 

. 
 et B = 
xn

b1
.. 
. 

bn
où x est la solution recherchée. Il s’agit d’un calcul matriciel simple mais qui nécessite
certaines vérifications. En effet, la manière la plus simple de résoudre ce système est de
faire comme s’il s’agissait d’une simple multiplication : si Ax = B alors
x=
B
A
Dans les multiplications simples, pour que cela soit vrai, il suffit que le nombre A soit
différent de 0. Dans le cadre du calcul matriciel, il faut que lamatrice A soit
 inversible,
1 ... 0
 .
.. 
c’est-à-dire qu’il existe une matrice B telle que AB=BA=In = 
. 
 ..
.
0 ... 1
Si une telle matrice existe, alors cette matrice B est égale à A-1 . La manière la plus
facile de vérifier si une telle matrice A est inversible est de calculer son déterminant. Pour
qu’une matrice soit inversible, il suffit que son déterminant soit non nul. MATLAB possède
une fonction qui permet de calculer automatiquement le déterminant d’une fonction, ainsi
que de calculer directement x=B/A sans avoir besoin de calculer la matrice inverse de A.
Le déterminant d’une matrice A est généralement calculé comme étant le produit des
valeurs propres de la matrice, donc si aucune de ses valeurs propres n’est nulle, on sait
que la déterminant sera non nul.
Guillaume BOUSQUET et Caroline FRITEYRE
8
Chapitre 2. Conception de l’interface graphique 2-D
2.1.2
Interface mise en place
Afin de débuter notre projet, et pour commencer notre apprentissage de construction
de fenêtres graphiques sous MATLAB, nous avons élaboré un système simple de résolution
de système matriciel Ax=B. L’interface est simple, elle comporte trois fenêtres à remplir,
une fenêtre résultat et une fenêtre remarque dans le cas où il y aurait un problème.
L’algorithme utilisé pour cet interface est le suivant :
Programme 1 Résolution matricielle
n <- lire(dimension) ;
A <- lire(matrice A) ;
B <- lire(vecteur B) ;
si A et B sont cohérents avec la dimension donné par n
alors
si Déterminant de A non nul
alors
Calcul de x <- B/A ;
Retourner x ;
sinon
Afficher ("erreur dans matrice A") ;
fin si
sinon
Afficher ("erreur dans la dimension") ;
fin si
Fig. 2.1: Interface graphique de résolution d’un système matriciel
Guillaume BOUSQUET et Caroline FRITEYRE
9
Chapitre 2. Conception de l’interface graphique 2-D
L’utilisateur commence par entrer la dimension du problème, c’est-à-dire le nombre de
lignes et de colonnes que la matrice A devra avoir, ainsi que le nombre de lignes qu’auront
les vecteurs x et b. Puis il rentre la matrice A et le vecteur b. En appyant sur le bouton
Résoudre, le logiciel MATLAB calcule le vecteur x solution. S’il n’y a aucune solution
possible, la fenêtre remarque affiche deux possibilités :
• soit l’utilisateur a entré une matrice A non inversible,
• soit la matrice A ou le vecteur b qui ont été écrits ne correspondent pas à la dimension
donnée par n.
Sinon le programme affiche le vecteur résultat.
2.2
2.2.1
La lecture de fonction
Lecture d’une fonction saisie
Nous avons créé une interface graphique qui permet d’afficher la représentation
graphique d’une fonction f : R → R entre deux abscisses Xmin et Xmax différentes,
comme cela nous est montré sur la figure 2.2.
Fig. 2.2: Interface graphique permettant de tracer une fonction entre deux bornes
Outre Xmin et Xmax , il a fallu récupérer la chaı̂ne de caractères donnant l’expression
de f (x) et l’appeler en des valeurs particulières. Se pose alors le problème de l’obtention
de la valeur f (a) à partir de la chaı̂ne de caractères et de la valeur a. Nous avons, pour
cela, utilisé cet algorithme décrit ci-dessous.
Il s’agit en fait de créer une nouvelle chaı̂ne de caractères à partir de la chaı̂ne initiale
où les x sont remplacés par (a), en faisant attention à ce qu’il ne s’agisse de x du terme
exp. Ensuite, on demande à la fonction eval d’évaluer cette nouvelle chaı̂ne représentant
une expression mathématique.
Guillaume BOUSQUET et Caroline FRITEYRE
10
Chapitre 2. Conception de l’interface graphique 2-D
Programme 2 fonction transformation
On place dans une cha^
ıne de caractères la fonction écrite par l’utilisateur ;
tant qu’on n’a pas parcouru toute la cha^
ıne faire
si on tombe sur un ’x’
alors
si on n’est pas en fin de cha^
ıne
alors
si le suivant n’est pas un ’p’
alors
% Il ne s’agit pas d’une exponentielle
On concatène le ’x’ de la cha^
ıne dans la fonction comme étant une variable
de la fonction finale ;
sinon
on écrit le ’x’ classique de la fonction exponentielle dans la
cha^
ıne finale ;
fin si
sinon
On concatène le ’x’ de la cha^
ıne comme étant une variable de la fonction
finale ;
fin si
sinon
% Ce n’est pas un ’x’.
On écrit la lettre classique dans la fonction finale ;
fin si
fait
On retourne la fonction ;
2.2.2
Représentation graphique
Pour représenter la fonction entre Xmin et Xmax , nous avons besoin d’un tableau de
valeurs d’abscisses x et d’un tableau de valeurs d’ordonnées y. Nous avons donc appliquer
l’algorithme suivant :
Programme 3 Affichage de la représentation graphique de f
Gr^
ace au pas et à l’intervalle des abscisses, on définit toutes les abscisses ;
tant qu’on n’a pas parcouru toutes les abscisses x
On calcule f(x) où f est la fonction déterminée en 2.2.1 ;
fait
On représente tous les f(x) en fonction des x sur le graphe ;
2.3
La lecture de surface
Au final, nous avons dû réaliser une interface graphique permettant de représenter
une zone définie par l’utilisateur à l’aide de rectangles et d’ellipses.
Guillaume BOUSQUET et Caroline FRITEYRE
11
Chapitre 2. Conception de l’interface graphique 2-D
2.3.1
La fonction ginput
Afin de définir les rectangles et ellipses, nous avons utilisé la fonction ginput qui prend
en argument le nombre de points à récupérer. Aussi, pour un rectangle, nous avons utilisé
l’instruction ginput(2) et, pour une ellipse, ginput(3). Lors de l’exécution du programme,
l’utilisateur a, selon son choix, défini au préalable en cliquant sur Tracer un rectangle ou
Tracer une ellipse, deux ou trois points à définir en cliquant avec le curseur sur le cadre
affichant les figures (voir figure 2.3).
Fig. 2.3: Déplacement du curseur sur le cadre pour sélectionner un point
2.3.2
La saisie de coordonnées
Il s’est ensuite avéré que cette façon de procéder n’était pas judicieuse car on manquait
de précision. En effet, il était difficile de cliquer sur un point précis avec le curseur. Aussi
avons-nous dû abandonner la fonction ginput pour des champs de valeurs à renseigner.
Nous avons alors décidé de nous servir directement de la saisie de coordonnées par
l’utilisateur dans des cases prévues à cet effet. Nous avons tout d’abord rajouté clairement
des emplacements pour que l’utilisateur puissent modifier les axes comme il le souhaite,
afin de rendre sa surface plus ou moins grande dans la fenêtre d’affichage. Ensuite, nous
avons décidé de donner la possibilité à l’utilisateur de se servir de coordonnées propres
aux rectangles et de coordonnées propres aux ellipses, c’est-à-dire définir deux points
pour le rectangle et trois points pour l’ellipse. Mais pour l’ellipse, un double problème
se pose. Tout d’abord, l’utilisateur doit donner des points très précis se trouvant sur
l’ellipse, ce qui est difficile, s’il n’a qu’une idée approximative de là où se situe le contour
de l’ellipse. De plus, comme nous l’avons vu dans la partie 1.4.2, le calcul est plus
compliqué à effectuer donc il y a risque de ralentir le programme.
Après discussion avec notre chef de projet, nous avons décidé de faire une interface
unique de saisie de coordonnées, de deux points définissant un rectangle, où ensuite
Guillaume BOUSQUET et Caroline FRITEYRE
12
Chapitre 2. Conception de l’interface graphique 2-D
l’utilisateur peut choisir de tracer le rectangle ou bien l’ellipse contenue dans ce rectangle.
2.3.3
La définition de la surface
Lorsque l’utilisateur demande à tracer un rectangle ou une ellipse, le programme
garde les coordonnées en mémoire et affiche dans un cadre la liste des figures présentes.
S’il a tracé deux rectangles puis une ellipse puis un rectangle puis une ellipse, la chaı̂ne de
caractères ’R1+R2+E1+R3+E2’ s’affiche alors par défaut dans le cadre situé à gauche du
bouton. Cette chaı̂ne définit la surface considérée, à savoir ici l’union de toutes les figures.
L’utilisateur peut modifier à sa guide cette chaı̂ne afin de définir sa propore surface à
afficher. Par exemple, la chaı̂ne ’R2-E1+R1’ définie la surface contenue à l’intérieur du
deuxième rectangle à laquelle a été enlevée la surface définie à l’intérieur de la première
ellipse à laquelle a ensuite été rajoutée la surface contenue à l’intérieur du premier rectangle. Des surfaces peuvent ainsi être enlevées et rajoutées au fur et à mesure de la lecture
de la chaı̂ne.
Nous avons ensuite dû mettre en place une fonction récoltant les données permettant
de traduire cette chaı̂ne en ensembles à ajouter et ôter. Cette dernière prend en entrée la
chaı̂ne de caractères et renvoie une structure dont les lignes correspondent aux différents
ensembles, la première colonne correspondant à l’appartenance ou non des points de la
surface considérée à cet ensemble, la deuxième, à la nature de la figure (rectangle ou
ellipse) et la troisième, à son numéro.
Programme 4 fonction récoltant les données
On initialise le vecteur des figures comme étant nul.
si la cha^
ıne est non vide
alors
si le caractère de début n’est pas un ’-’
alors
On rajoute un ’+’ au début de la cha^
ıne ;
fin si
tant qu’on n’a pas parcouru toute la cha^
ıne
On récupère le prochain bloc codant un signe, un caractère et un nombre
et on les stocke dans une structure à la suite du vecteur;
fait
fin si
Retourner le vecteur des figures ;
Enfin, on a dû écrire une fonction appartient qui indique si un point (x, y) donné
appartient ou non à la surface considérée. Pour cela, on part de la fin de la structure
donnees - qui correspond à la traduction de la chaı̂ne entrée par l’utilisateur. Tant que
l’on ne trouve pas une figure dans laquelle se trouve un point considéré, on passe à la
figure précédente. S’il s’avère que le point n’appartient à aucune des figures, on considère
qu’il n’appartient pas à la surface définie.
Guillaume BOUSQUET et Caroline FRITEYRE
13
Chapitre 2. Conception de l’interface graphique 2-D
Programme 5 fonction déterminant les points de la surface finale
On récupère la matrice des figures définies à partir de la cha^
ıne
entrée par l’utilisateur ;
si elle est vide
alors
On indique que l’utilisateur n’a pas défini de surface ;
sinon
pour chaque point du cadre
tant que non stop et qu’on n’a pas parcouru toute la matrice de figures
% en partant de la fin de la matrice
si le point appartient à la figure
alors
si le signe de la figure est ’+’
alors
on l’affiche ;
fin si
stop ;
fin si
fait
fait
fin si
2.3.4
L’interface finale
Une fois le projet terminé, nous avons décidé de construire une dernière interface
graphique plus simple d’utilisation ainsi qu’un système de sauvegarde de la surface et de
nettoyage de la mémoire pour éviter à l’utilisateur de devoir fermer et ouvrir à nouveau
l’interface pour l’utiliser.
L’utilisateur entre donc les axes, autant de surfaces qu’il souhaite, puis dans le champ
sous la figure, détermine la surface qu’il souhaite mailler. Après avoir cliqué sur Tracer la
surface, il voit se dessiner la surface à mailler. Pour représenter cette surface, on se sert
de l’ensemble des points qui composent cette surface. Pour chaque point, on trace un
petit rectangle de manière à noircir la surface finale, et donc fait clairement apparaı̂tre la
surface déterminée par l’utilisateur.
Si cette surface ne convient pas à l’utilisateur, il peut modifier la surface à tracer et
cliquer à nouveau sur le bouton Tracer la surface, de même s’il souhaite reprendre son
travail à zéro, il lui suffit de cliquer sur le bouton Tout effacer qui videra la mémoire
occupée, et effacera la figure tracée. Mais si la surface lui convient, il lui suffit alors de
cliquer sur le bouton Enregistrez la surface, qui ouvrira une petite fenêtre lui proposant
d’enregistrer l’ensemble des points appartennant à la surface dans un fichier de type .mat
sous le nom et le répertoire qu’il souhaite. Une fois cela effectué, il n’aura plus qu’à faire
passer ce fichier par les fonctions de maillage qu’il aura choisies pour obtenir le maillage
de la surface.
Guillaume BOUSQUET et Caroline FRITEYRE
14
Chapitre 2. Conception de l’interface graphique 2-D
Fig. 2.4: Interface finale pour la définition de surface
Fig. 2.5: Représentation de la surface définie par l’utilisateur
Guillaume BOUSQUET et Caroline FRITEYRE
15
Chapitre 2. Conception de l’interface graphique 2-D
Fig. 2.6: Enregistrement de la surface définie par l’utilisateur
Guillaume BOUSQUET et Caroline FRITEYRE
16
Chapitre 3
Résultats et discussions
3.1
Problèmes rencontrés et limites
Tout au long de ce projet, nous avons dû très souvent faire face à des problèmes liés
d’une part à la théorie mathématique mais aussi aux possibilités du logiciel MATLAB.
Comme nous l’avons vu précédemment, tracer une ellipse peut se faire de plusieurs façons
qui n’ont ni le même temps de calcul ni la même précision. De même, notre projet ne
traitait pas du maillage à deux dimensions spécifiquement, mais de la manière d’obtenir
des surfaces à mailler.
Les principaux problèmes que nous avons rencontrés et les solutions que nous avons
construites sont les suivants :
• le temps de traçage des surfaces simples (rectangles et ellipses),
• le temps de calcul des surfaces définies par l’utilisateur,
• la gestion des erreurs dans le cas des ellipses,
• l’enregistrement des données,
• le nettoyage de la mémoire.
Comme expliqué dans le paragraphe 2.3.2, nous avons préféré saisir les ellipses à partir
des rectangles les contenant. Cela facilite le temps de calcul et diminue la complexité du
calcul, mais oblige l’utilisateur à savoir dans quel rectangle l’ellipse se situe, c’est-à-dire
connaı̂tre le centre de l’ellipse, ainsi que son petit et grand axe. Ainsi, un utilisateur qui
ne connaı̂t que trois points placés sur l’ellipse ne pourra pas la tracer. Cela permet aussi
de ne plus se soucier des erreurs dues à de mauvaises coordonnées. En effet, lorsque les
coordonnées des trois points sont entrées, elles peuvent définir soit une ellipse, soit une
hyperbole, soit aucune des deux. La seule erreur à prendre en compte est alors la mauvaise
entrée de points vis-à-vis des axes prédéfinis.
De la même manière, le temps de calcul des surfaces est soumis à conditions. Nous
délimitons un ensemble de points appartenant à toutes les surfaces tracées, puis nous
vérifions point par point s’ils appartiennent ou non à la surface définie par l’utilisateur.
Le principal problème est alors le temps de calcul de l’appartennance ou non des points
à la surface. Plus le nombre de points est élevé, plus le temps de calcul est long. Mais
pour obtenir une surface correctement définie afin d’obtenir un bon maillage, nous devons
fournir un maximum de points dans la surface. Le temps de calcul est la principale limite
de l’interface finale.
Guillaume BOUSQUET et Caroline FRITEYRE
17
Chapitre 3. Résultats et discussions
Enfin le dernier problème que nous avons rencontré est celui de la mémoire. En effet
lorsque l’utilisateur souhaitait définir deux surfaces, il devait fermer et relancer l’interface
entre chaque étape. Nous avons décidé de mettre en place le bouton Tout effacer (voir
partie 2.3.4). Mais une fois que l’utilisateur appuie sur le bouton, il ne peut plus revenir
en arrière et récupérer les données qu’il avait entrées. Il doit donc être sûr de ne plus
avoir besoin de celles-ci avant de cliquer sur le bouton.
3.2
Améliorations possibles
Ce projet, bien que terminé, peut être amélioré. Nous avons d’ailleurs créé un fichier
executable afin de se servir de l’interface sans avoir besoin de lancer MATLAB. Toutefois,
cet exécutable ne se lance correctement que sous les systèmes d’exploitation Windows
XP/Vista. Une première amélioration pourrait donc être de créer un exécutable pour
les système Linux/Unix/Mac.
Une autre amélioration possible est celui de l’insertion du maillage dans l’interface
graphique. En effet, nous n’avons pas maillé les surfaces. L’utilisateur se sert de notre
projet pour définir sa surface puis passe le fichier résultat par les fonctions de maillage.
Nous avons pensé à regrouper notre programme et les fonctions, mais après discussion
avec notre chef de projet, il s’est avéré que lier les deux peut présenter de forts risques
de provoquer une panne du programme à cause d’un trop grand temps de calcul. Une
amélioration pourrait être de revoir la structure de calcul du programme et de la rendre
compatible avec les fonctions de maillages, afin de rendre possible la création d’un programme unique définissant la surface et le maillage au sein d’une même fenêtre graphique.
Mais la plus grosse évolution possible de ce programme pourrait être celle de la définition des surfaces. En effet, d’une part, l’utilisateur n’a que des ellipses et des rectangles
à sa disposition pour définir sa surface, et il doit uniquement jouer avec des intersections
et des unions pour définir la surface à mailler. La première évolution pourrait être de
permettre à l’utilisateur d’avoir à sa disposition d’autres formes géométriques prédéfinies
(triangles, quadrilatères sans propriétés...) ou alors de lui faire définir une surface fermée
par autant de côtés qu’il le souhaite grâce à un système de traits tracés les uns à la suite
des autres, un peu comme dans le logiciel paint sous Windows. D’autre part, une autre
évolution possible serait de permettre de sélectionner à la souris les zones définissant la
surface, afin que l’utilisateur n’ait pas à se poser la question de savoir si les unions et les
intersections prennent bien en compte les surfaces souhaitées.
Guillaume BOUSQUET et Caroline FRITEYRE
18
Conclusion
Notre interface remplit aujourd’hui les conditions que nous avions fixées au départ,
à savoir générer des surfaces fermées à partir de composantes simples, et permettre
l’enregistrement d’un nombre significatif de points contenus dans ces surfaces dans des
fichiers de type .mat. Toutefois, il existe plusieurs possibilités d’améliorations, notamment
sur le plan du maillage, puisque le projet n’a pas pu être directement rattaché aux
fonctions de maillages de M. KOKO. La structure simple de notre programme permettra
de modifier facilement le contenu pour inclure les fonctions de maillages directement dans
l’interface.
Grâce à ce projet, nous avons pu découvrir une grande partie du logiciel MATLAB que
nous n’avons pu voir en cours par manque de temps. Ce projet nous a appris à prendre
en compte l’ergonomie d’un programme, et de se placer du point de vue d’un utilisateur
n’ayant pas de connaissances particulières en géométrie et en analyse numérique.
Bibliographie
[1] Cours d’Analyse Numérique, ISIMA 1ère année. Koko J, Barra V, Mahey F. Analyse
Numérique Matricielle et Optimisation.
[2] Cours de Logiciel Numérique, ISIMA 2ème année. Koko J. Cours de Logiciel
Numérique: MATLAB.
[3] Site officiel de MATLAB: http://www.mathworks.fr/.
[4] The MathWorks.MATLAB: Creating Graphical User Interfaces.
[5] Per-Olof Persson and Gilbert Strang DistMesh - A Simple Mesh Generator in MATLAB Department of Mathematics at Masachusetts Institute of Technology. 2005.
http://www-math.mit.edu/ persson/mesh/
ANNEXES
Annexe A
Extraits du code source de la lecture
et de la représentation graphique
d’une fonction
Programme 6 Récupération des abscisses et de la chaı̂ne entrée par l’utilisateur
function bouton_tracer_Callback(hObject, eventdata, handles)
hold on
x1 = str2double(get(handles.Xmin, ’string’)) ;
x2 = str2double(get(handles.Xmax, ’string’)) ;
p=abs(x2-x1)/500 ;
% Définition du pas d’avancement
x=x1:p:x2 ;
% Détermination de l’intervalle
% On récupère la fonction entrée par l’utilisateur.
chaine = get(handles.fonction_a_tracer, ’string’) ;
Chapitre A. Extraits du code source de la lecture et de la représentation graphique
d’une fonction
Programme 7 Evaluation de la fonction
for parcours=1:length(x)
chaine_transformee = ’’ ;
l = 0 ;
for k = 1:length(chaine)
if chaine(k) == ’x’
if k<length(chaine)
% On n’est pas en bout de cha^
ıne.
if chaine(k+1)~= ’p’
% Il ne s’agit pas d’un "exp".
valeur_chaine = num2str(x(parcours)) ;
l = l + length(valeur_chaine) + 2 ;
chaine_transformee = strcat(chaine_transformee, ’(’) ;
chaine_transformee = strcat(chaine_transformee, valeur_chaine) ;
chaine_transformee = strcat(chaine_transformee, ’)’) ;
else
% Il s’agit d’un "exp".
l = l + 1 ;
chaine_transformee(l) = chaine(k) ;
end
else
% Il s’agit d’un "x" en bout de cha^
ıne.
valeur_chaine = num2str(x(parcours)) ;
l = l + length(valeur_chaine) + 2 ;
chaine_transformee = strcat(chaine_transformee, ’(’) ;
chaine_transformee = strcat(chaine_transformee, valeur_chaine) ;
chaine_transformee = strcat(chaine_transformee, ’)’) ;
end
else
% Ce n’est pas un x.
l = l + 1 ;
chaine_transformee(l) = chaine(k) ;
end
end
y(parcours) = eval(chaine_transformee) ; % calcul de la valeur de y
end
Programme 8 Représentation graphique de la fonction
%Graphe de la fonction y(x)
axes(handles.graphe)
plot(x,y)
Guillaume BOUSQUET et Caroline FRITEYRE
II
Annexe B
Extraits du code source de l’interface
de définition de surface
Programme 9 Réglage des axes
% booleen -> 1 -> c’est bon
%
2 -> c’est pas bon
function booleen = reglage_axes(h)
booleen = false ;
[Xmin,Xmax,Ymin,Ymax] = coordonnees(h) ;
if isnan(Xmin) | isnan(Xmax) | isnan(Ymin) | isnan(Ymax)
nb_messages = nb_messages + 1 ;
set(h.texte_message, ’string’,...
[’erreur nř’ num2str(nb_messages) ’ :...
Xmin, Xmax, Ymin ou Ymax incorrects (== NaN)’]) ;
else
booleen = ~(Xmin >= Xmax || Ymin >= Ymax) ;
if ~booleen
nb_messages = nb_messages + 1 ;
set(h.texte_message, ’string’,...
[’erreur nř’num2str(nb_messages)’: Xmin >= Xmax ou Ymin >= Ymax’]) ;
else
axis([Xmin Xmax Ymin Ymax]) ;
end
end
Chapitre B. Extraits du code source de l’interface de définition de surface
Programme 10 Tracé d’un rectangle
function bouton_rectangle_Callback(hObject, eventdata, handles)
e = 1 ;
% epaisseur du trait
if reglage_axes(handles)
x1_rect = str2double(traitement(get(handles.x1_rect,
x2_rect = str2double(traitement(get(handles.x2_rect,
y1_rect = str2double(traitement(get(handles.y1_rect,
y2_rect = str2double(traitement(get(handles.y2_rect,
’String’)))
’String’)))
’String’)))
’String’)))
;
;
;
;
if isnan(x1_rect) | isnan(x2_rect) | isnan(y1_rect) | isnan(y2_rect)
nb_messages = nb_messages + 1 ;
set(handles.texte_message, ’string’,...
[’erreur nř’num2str(nb_messages)’:coordonnees du rectangle invalides’]);
else
L = abs(x2_rect - x1_rect) ;
% cotes paralleles a l’axe des abscisses
H = abs(y2_rect - y1_rect) ;
% cotes paralleles a l’axe des ordonnees
X = min(x1_rect, x2_rect) ;
% [X,Y] sommet du triangle en bas a gauche
Y = min(y1_rect, y2_rect) ;
if L == 0 |H == 0
nb_messages = nb_messages + 1 ;
set(handles.texte_message, ’string’,...
[’erreur nř’ num2str(nb_messages) ’ : L <= 0 ou H <= 0’]) ;
else
rectangle(’Position’,[X,Y,L,H], ’Curvature’,[0,0],...
’LineWidth’,e,’LineStyle’,’-’) ;
hold on
chaine = get(handles.formule_intitule, ’string’) ;
if (nb_rect > 0 || nb_ell > 0)
chaine = strcat(chaine, ’+R’) ;
else
chaine = strcat(chaine, ’R’) ;
end
nb_rect = nb_rect + 1 ;
chaine = strcat(chaine, num2str(nb_rect)) ;
set(handles.formule_intitule, ’string’, chaine) ;
rect(nb_rect).xx = X ;
rect(nb_rect).yy = Y ;
rect(nb_rect).ll = L ;
rect(nb_rect).hh = H ;
set(handles.texte_message, ’string’,...
strcat(’Affichage du rectangle [X, Y, L, H] = ’,...
num2str(X), ’, ’, num2str(Y), ’, ’, num2str(L), ’, ’, num2str(H))) ;
end
end
end
Guillaume BOUSQUET et Caroline FRITEYRE
IV
Chapitre B. Extraits du code source de l’interface de définition de surface
Programme 11 Tracé d’une ellipse
function bouton_ellipse_Callback(hObject, eventdata, handles)
e = 1 ;
% epaisseur du trait
if reglage_axes(handles)
x1_rect = str2double(traitement(get(handles.x1_rect, ’String’))) ;
x2_rect = str2double(traitement(get(handles.x2_rect, ’String’))) ;
y1_rect = str2double(traitement(get(handles.y1_rect, ’String’))) ;
y2_rect = str2double(traitement(get(handles.y2_rect, ’String’))) ;
if isnan(x1_rect) | isnan(x2_rect) | isnan(y1_rect) | isnan(y2_rect)
nb_messages = nb_messages + 1 ;
set(handles.texte_message, ’string’,...
[’erreur nř’num2str(nb_messages)’:coordonnees du rectangle invalides’]);
else
L = abs(x2_rect - x1_rect)/2 ; % cotes paralleles a l’axe des abscisses
H = abs(y2_rect - y1_rect)/2 ; % cotes paralleles a l’axe des ordonnees
X = min(x1_rect, x2_rect) ;
% [X,Y] sommet du triangle en bas a gauche
Y = min(y1_rect, y2_rect) ;
if L == 0 |H == 0
nb_messages = nb_messages + 1 ;
set(handles.texte_message, ’string’,...
[’erreur nř’ num2str(nb_messages) ’ : L <= 0 ou H <= 0’]) ;
else
rectangle(’Position’,[X,Y,2*L,2*H], ’Curvature’,[1,1],...
’LineWidth’,e,’LineStyle’,’-’) ;
hold on
chaine = get(handles.formule_intitule, ’string’) ;
if (nb_rect > 0 || nb_ell > 0)
chaine = strcat(chaine, ’+E’) ;
else
chaine = strcat(chaine, ’E’) ;
end
nb_ell = nb_ell + 1 ;
chaine = strcat(chaine, num2str(nb_ell)) ;
set(handles.formule_intitule, ’string’, chaine) ;
ell(nb_ell).xx = X ;
ell(nb_ell).yy = Y ;
ell(nb_ell).ll = L ;
ell(nb_ell).hh = H ;
set(handles.texte_message, ’string’,...
strcat(’Affichage de lellipse [X, Y, L, H] = ’,...
num2str(X), ’, ’, num2str(Y), ’, ’,...
num2str(L), ’, ’, num2str(H))) ;
end
end
end
Guillaume BOUSQUET et Caroline FRITEYRE
V
Chapitre B. Extraits du code source de l’interface de définition de surface
Programme 12 Récupération de la chaı̂ne entrée par l’utilisateur
function bouton_formule_Callback(hObject, eventdata, handles)
if reglage_axes(handles)
e = 1 ;
% epaisseur du trait
chaine = traitement(get(handles.formule_intitule, ’String’)) ;
donnees = recolte_donnees(chaine) ; % vecteur (signe caractere numero)
if size(donnees,2) == 0
nb_messages = nb_messages + 1 ;
set(handles.texte_message, ’string’,...
[’erreur nř’num2str(nb_messages)’:chaine pour le maillage invalide’]) ;
else
correct = 1 ;
% verifier que les numeros entres sont bons
i = 1 ;
while correct && i <= size(donnees,2)
correct = (donnees(i).caractere==’R’&& donnees(i).numero<= nb_rect)...
||(donnees(i).caractere==’E’&& donnees(i).numero<= nb_ell);
i = i + 1 ;
end
if correct
[Xmin,Xmax,Ymin,Ymax] = coordonnees(handles) ;
px = (Xmax - Xmin)/100 ;
py = (Ymax - Ymin)/100 ;
x = Xmin:px:Xmax ;
y = Ymin:py:Ymax ;
for i=1:100
for j=1:100
if appartient(x(i),y(j),donnees,rect,ell) > 0
rectangle(’Position’,[x(i)-px/4,y(j)-py/4,px/2,py/2],...
’Curvature’,[1,1], ’LineWidth’,1.5,’LineStyle’,’-’) ;
end
end
end
hold on
else
nb_messages = nb_messages + 1 ;
set(handles.texte_message, ’string’,...
[’erreur nř’ num2str(nb_messages) ’ :...
indices de rectangles ou dellipses invalides’]) ;
end
end
end
Guillaume BOUSQUET et Caroline FRITEYRE
VI
Chapitre B. Extraits du code source de l’interface de définition de surface
Programme 14 Fonction d’appartenance à une surface
function booleen = appartient(x,y,donnees,v_rect,v_ell)
i = size(donnees,2) ;
booleen = 0 ;
% 0 -> On ne sait pas.
% -1 -> pas dedans
% 1 -> dedans
while ~booleen && i > 0
point = donnees(i) ;
num = point.numero ;
if (point.caractere == ’R’ && x >= v_rect(num).xx &&...
y >= v_rect(num).yy && ...
x <= (v_rect(num).xx + v_rect(num).ll) && ...
y <= (v_rect(num).yy + v_rect(num).hh)) || ...
(point.caractere == ’E’...
&& norm([((x - v_ell(num).xx)/v_ell(num).ll - 1)...
((y - v_ell(num).yy)/v_ell(num).hh - 1)]) <= 1)
if point.signe == ’+’
booleen = 1 ;
else
if point.signe == ’-’
booleen = -1 ;
end
end
end
i = i - 1 ;
end
Guillaume BOUSQUET et Caroline FRITEYRE
VII
Chapitre B. Extraits du code source de l’interface de définition de surface
Programme 15 Fonction enregistrer
function bouton_enregistrer_Callback(hObject, eventdata, handles)
if reglage_axes(handles)
A=[0,0];
B=null(A);
chaine = traitement(get(handles.formule_intitule, ’String’)) ;
% donnees : vecteur de structure (signe caractere numero)
donnees = recolte_donnees(chaine) ;
if size(donnees,2) == 0
nb_messages = nb_messages + 1 ;
set(handles.texte_message, ’string’,...
[’erreur nř’num2str(nb_messages)’:chaine pour le maillage invalide’]);
else
% verifier que les numeros entres sont bons !!!
correct = 1 ;
i = 1 ;
while correct && i <= size(donnees,2)
correct = (donnees(i).caractere == ’R’ && donnees(i).numero <= nb_rect)...
|| (donnees(i).caractere == ’E’ && donnees(i).numero <= nb_ell) ;
i = i + 1 ;
end
if correct
[Xmin,Xmax,Ymin,Ymax] = coordonnees(handles) ;
px = (Xmax - Xmin)/100 ;
py = (Ymax - Ymin)/100 ;
x = Xmin:px:Xmax ;
y = Ymin:py:Ymax ;
for i=1:100
for j=1:100
if appartient(x(i),y(j),donnees,rect,ell) > 0
B=[B;x(i),y(j)];
end
end
end
%save(’resultat.mat’,’B’);
[filename, pathname] = uiputfile(’*.mat’, ’Pick an M-file’) ;
if isequal(filename,0) || isequal(pathname,0)
disp(’User pressed cancel’)
else
save(fullfile(pathname, filename),’B’) ;
end
else
nb_messages = nb_messages + 1 ;
set(handles.texte_message, ’string’,...
[’erreur nř’ num2str(nb_messages) ’ :...
indices de rectangles ou dellipses invalides’]) ;
end
end
end
Guillaume BOUSQUET et Caroline FRITEYRE
VIII
Chapitre B. Extraits du code source de l’interface de définition de surface
Guillaume BOUSQUET et Caroline FRITEYRE
IX
Chapitre B. Extraits du code source de l’interface de définition de surface
Guillaume BOUSQUET et Caroline FRITEYRE
X

Documents pareils