Previous Up Next

Chapitre 4  Fonctionnalités avancées

Dans ce chapitre, nous présentons les fonctionnalités qui permettent d’étendre les possibilités de Dr. Geo ou de l’adapter à une situation pédagogique donnée.

La première est la macro-construction. Elle permet d’extraire une construction logique pour la placer dans un enregistrement. Cet enregistrement peut ensuite être répété autant de fois que souhaité, sauvegardé dans un fichier et ouvert ultérieurement dans une autre figure.

Les scripts Smalltalk Dr. Geo représentent une autre fonctionnalité pour étendre Dr. Geo. Ces scripts sont de véritables items de figure, comme les items géométriques. En entrée, ils reçoivent une ou plusieurs références d’items géométriques et ils retournent une valeur placée dans la figure. Ce sont en fait des fonctions1 greffées dans une figure, elles sont évaluées à chaque mise à jour de la figure (c.-à-d. lorsque la figure a besoin d’être redessinée). Les scripts Smalltalk Dr. Geo sont utiles pour la valeur qu’ils retournent ou leur effet de bord, cela dépend de ce que l’utilisateur souhaite réaliser.

En extension des scripts Smalltalk, Dr. Geo propose d’aller encore plus loin avec les figures Smalltalk de Dr. Geo. Cette fois il s’agit de décrire une figure géométrique complètement sous la forme d’un code source écrit dans le langage Smalltalk. La force de cette approche est de permettre une construction fonctionnelle2 des figures et non plus simplement déclarative comme c’est le cas avec l’interface graphique.

4.1  Macro-construction

Une macro-construction ressemble un peu à une procédure qui reçoit des items d’une figure en entrée et qui retourne un ou plusieurs items de figure, construits par la macro-construction. Une macro est construite à partir d’un modèle défini par l’utilisateur. Cela signifie que l’utilisateur doit réaliser la séquence de construction une première fois dans une figure puis demander à Dr. Geo de l’enregistrer dans une macro-construction. La macro-construction peut ensuite être sauvegardée dans un fichier au même titre qu’une figure.

Pour enregistrer une séquence de construction, Dr. Geo doit connaître les items initiaux de la séquence ainsi que les items finaux. Évidemment, les items finaux ne doivent dépendre que des items initiaux3, sinon Dr. Geo ne sera pas capable de déduire les items finaux à partir des items initiaux.

Ainsi, Dr. Geo déduit la logique de la séquence de construction et l’enregistre dans une macro-construction. L’utilisateur peut alors répéter cette séquence en jouant la macro-construction, elle demande seulement des items initiaux (du même type) de la figure et construit les items résultants.

Les items de figure intermédiaires et invisibles sont aussi construits par la macro-construction. Ils sont nécessaires pour construire les items résultants.

Pour illustrer la fonctionnalité macro-construction, nous prenons l’exemple de la construction du cercle passant par trois points.


Figure 4.1: La figure initiale

Avant la création de la macro-construction, l’utilisateur doit construire la figure finale, elle est considérée comme modèle par la macro-construction.


Figure 4.2: La figure avec la construction finale

4.1.1  Création d’une macro-construction

À cette étape, la séquence de construction est faite. L’utilisateur doit maintenant avertir Dr. Geo qu’il veut une macro-construction à partir de cette séquence. Il doit appeler la fonction Construire une macro à partir de la barre d’icones ou depuis le menu Macro-construction>Construire une macro de la fenêtre de la figure.

Depuis la boîte de dialogue qui s’affiche alors, l’utilisateur sélectionne les paramètres d’entrée et de sortie, le nom et la description de la macro-construction.


Figure 4.3: Première page introductive de la boîte de dialogue de l’assistant pour construire une macro-construction

La seconde page de la boîte de dialogue sert à sélectionner les paramètres d’entrée. Dans notre exemple, ce sont les trois points initiaux. L’utilisateur a juste besoin d’aller jusqu’à cette seconde page et il sélectionne les trois points A, B et C de la figure. Les points sélectionnés clignotent alors et leur nom s’affiche dans la page de la boîte de dialogue.


Figure 4.4: La seconde page, les trois points sont sélectionnés

À partir de la troisième page, l’utilisateur choisit les paramètres de sortie. Dans notre exemple, nous voulons le cercle et son centre comme résultat de la macro-construction. L’utilisateur clique alors sur ces deux objets dans la figure, lorsque sélectionnés ces derniers clignotent et leur nom apparaît dans la boite de dialogue.


Figure 4.5: La troisième page, le cercle et son centre sont sélectionnés

Dans la quatrième page, l’utilisateur entre le nom et la description de la macro-construction. Ces informations sont affichées lorsque l’utilisateur exécute une macro-construction. Ceci permet de distinguer les macro-constructions entre elles.


Figure 4.6: La quatrième page, le nom et la description de la macro-construction

L’utilisateur valide ensuite la définition de la macro-construction en appuyant sur le bouton Appliquer. Il peut aussi revenir aux étapes précédentes pour ajuster les paramètres de la macro-construction.

Si la sélection des paramètres d’entrée et de sortie ne correspond pas (Dr. Geo ne peut pas extraire la logique de la construction), la macro-construction ne peut pas être créée. Dans ce cas, l’utilisateur doit reconsidérer la sélection des paramètres d’entrée et de sortie. Il peut revenir à la seconde ou la troisième page de la boîte de dialogue de l’assistant pour ajuster ses choix.

À cette étape, la macro-construction est créée et enregistrée dans Dr. Geo. Dans la prochaine section, nous verrons comment l’utiliser.

4.1.2  Jouer une macro-construction

À l’aide de la boîte de dialogue

Pour exécuter une macro-construction, l’utilisateur clique sur le bouton de la barre d’outils ou choisit le menu Macro-construction>Jouer une macro de la fenêtre de la figure. Une boîte de dialogue décrivant la procédure s’affiche alors.

À partir de celle-ci, l’utilisateur sélectionne la macro-construction. Dans la seconde page, il sélectionne la macro-construction dans la liste en haut de la boîte de dialogue. Une fois la macro sélectionnée, il peut directement choisir les paramètres d’entrée dans la figure. Dès que tous les paramètres d’entrée sont sélectionnés, la macro-construction est exécutée et les paramètres finaux sont affichés.


Figure 4.7: L’utilisateur sélectionne les paramètres d’entrée dans la figure

Dans notre exemple, la macro-construction nécessite trois paramètres d’entrée (trois points) et elle construit un point et un cercle. Pour exécuter notre macro-construction, il faut une figure avec au moins trois points.


Figure 4.8: Une figure avec trois points

Une fois que notre macro-construction est appliquée à ces trois points, nous avons le cercle souhaité et son centre.


Figure 4.9: La figure finale avec le cercle et son centre

4.2  Script Smalltalk Dr. Geo

Dr. Geo est une application dynamique écrite en Smalltalk. Cela signifie qu’il est possible de modifier Dr. Geo alors qu’il est en cours de fonctionnement. Nous avons exploité cette possibilité pour définir dans Dr. Geo des items de figure qui sont en fait des scripts Smalltalk – des bouts de codes – pour étendre dynamiquement, à l’infini, les possibilités de Dr. Geo. Mais qu’est-ce que Smalltalk ?

Smalltalk est un langage de programmation orienté objet, réflexif et dynamiquement typé. Il fut l’un des premiers langages de programmation à disposer d’un environnement de développement intégré complètement graphique. Il a été créé en 1972. Il est inspiré par Lisp et Simula. Il a été conçu par Alan Kay, Dan Ingals, Ted Kaehler, Adele Goldberg au Palo Alto Research Center de Xerox. Le langage a été formalisé en tant que Smalltalk-80 et est depuis utilisé par un grand nombre de personnes. Smalltalk est toujours activement développé.

Smalltalk a été d’une grande influence dans le développement de nombreux langages de programmation, dont : Objective-C, Actor, Java et Ruby.

Un grand nombre des innovations de l’ingénierie logicielle des années 1990 viennent de la communauté des programmeurs Smalltalk, tels que les Design Patterns (appliquées au logiciel), l’Extreme Programming (XP) et le refactoring. Ward Cunningham, l’inventeur du concept du Wiki, est également un programmeur Smalltalk.4

Cet extrait de la préface du livre Pharo By Example5http://pharobyexample.org – décrit précisément la plate forme Smalltalk utilisée pour Dr. Geo :

Pharo est une implémentation moderne, libre et complète de l’environnement et langage de programmation Smalltalk.

Pharo s’attache à offrir une plate forme robuste et stable pour du développement professionnel en langages et environnement dynamiques.

Dr. Geo exploite l’environnement Smalltalk pour proposer, d’une part, un environnement convivial d’écriture de scripts et, d’autre part, pour donner accès à l’interface des items géométriques ou numériques constitutifs d’une figure. L’interface est en fait l’ensemble des méthodes d’instance – fonctions de classe – de ces items.

Ainsi l’utilisateur peut écrire des scripts pour manipuler les items des figures ; et puisque ces scripts sont des items de figure au même titre que d’autres, ils n’ont pas besoin d’être dans un fichier séparé, ils sont enregistrés dans le fichier de la figure.

L’autre grande force des script est de s’appuyer sur l’environnement de développement de Pharo Smalltalk ; l’utilisateur bénéficie ainsi d’outils évolués pour mettre au point ses scripts : navigateur de classes, inspecteur, débogueur, etc. L’utilisateur souhaitant exploiter au mieux la puissance des scripts est donc invité à étudier le livre Pharo By Examplehttp://pharobyexample.org, il y apprendra le langage Smalltalk et son environnement.

4.2.1  Script par l’exemple

Les scripts ont deux facettes :

L’outil pour créer ou éditer un script est disponible depuis le menu Numériques>Éditer un script , la fonction est aussi disponible depuis la barre d’outils.

L’outil pour utiliser un script est disponible depuis le menu Numériques>Utiliser un script , la fonction est aussi disponible depuis la barre d’outils.

Un script peut recevoir de 0 à n paramètres d’entrée. Après avoir choisi un script à insérer dans la figure, il suffit de choisir, dans la construction, les paramètres d’entrée puis de cliquer quelque part sur le fond de la figure pour y placer le résultat du script.

Dans la suite nous vous proposons de travailler sur quelques exemples de scripts, leurs fonctionnalités et leur puissance seront plus facilement analysées. Les scripts, comme les macro-constructions, donnent une dimension particulière à Dr. Geo, ils permettent – chacun avec un positionnement différent6 – d’aller là où les auteurs du logiciel ne sont pas allés ou ne souhaitent pas aller.

Il est aussi important de comprendre que la plupart des fonctionnalités de Pharo Smalltalk sont disponibles depuis les scripts. C’est particulièrement vrai pour ses bibliothèques de fonctions7, nous allons bien sûr les utiliser intensément.

Script sans paramètre d’entrée

Premier exemple :

La procédure pour créer un script sans paramètre d’entrée est la suivante :

  1. Édition du script
    1. Choisir Numériques>Éditer un script dans le menu. L’éditeur de script s’affiche alors :

      Figure 4.10: L’éditeur de script

      L’éditeur de script comprend trois parties :

      • En haut à gauche les catégories de scripts, il s’agit simplement de les y ranger : examples, private et scripts. C’est dans cette dernière catégorie que l’utilisateur doit placer ses scripts.
      • En haut à droite les scripts de la catégorie sélectionnée sont présentés à l’utilisateur. En cliquant sur un de ceux-ci, son code source est affiché dans l’éditeur de texte en bas.
      • En bas sur toute la largeur, la zone texte avec le code source du script sélectionné. C’est ici que nous créons ou modifions les scripts. Pour valider une modification, il suffit de presser les touches Ctrl-s.
    2. Dans l’éditeur de script, cliquer sur la catégorie scripts jusqu’à ce que la zone texte en bas contienne le modèle de script tel qu’affiché dans la figure 4.10.
    3. Saisir le code source ci-dessous et comme dans la figure 4.11 :
            MonPremierScript
            "Le commentaire de mon premier script"
               ^ 'hello !'.
          

      Sauvegarder le script par la combinaison de touches Ctrl-s, Dr. Geo vous demandera vos nom et prénom, vous pouvez entrer vos initiales, c’est sans grande importance pour le moment. La premier ligne du script, MonPremierScript désigne le nom du script, la suite est le code source du script. La première ligne de celui-ci, entre guillemets, est un commentaire de ce que fait le script, nous conseillons de bien le documenter car c’est utile pour la suite.


      Figure 4.11: Mon premier script

      L’éditeur de script peut maintenant être fermé.

  2. Utilisation du script dans la figure
    Choisir Numériques>Utiliser un script dans le menu. Dans la boîte de dialogue qui s’affiche alors, choisir le script MonPremierScript que nous avons créé précédemment. Noter qu’à chaque fois qu’un script est choisi, son commentaire descriptif est affiché en bas de la boîte de dialogue.

    Figure 4.12: Choisir un script

    Une fois le script sélectionné, cliquer dans la figure à l’emplacement souhaité, le script y sera inséré ; dans cet exemple le script ne fait que retourner le message «  hello ! ». La valeur retournée par un script est celle affichée dans la figure.

Dans les exemples qui suivent, nous donnons simplement le code source des scripts Smalltalk, il suffira de reprendre les étapes expliquées précédemment pour créer le script correspondant et l’utiliser dans une figure, nous ne revenons pas sur ces étapes.

Un générateur de nombres aléatoires et autres :

Si vous souhaitez un générateur de nombres entiers aléatoires entre 0 et 10, rien de plus simple, c’est ce que fait le script suivant :

aléatoire
"Je retourne un nombre continuellement modifié aléatoirement"
   ^ 10 atRandom.

À chaque mise à jour de la figure, il génère un nombre aléatoire entier dans l’intervalle [0 ; 10].

Si vous préférez un nombre flottant dans l’intervalle [0 ; 1], utilisez ce script :

aléatoire2
"Je retourne un nombre décimal aléatoire entre 0 et 1"
   ^ 100 atRandom / 100.
Quelques précisions :
  • La valeur retournée par le script est le résultat de l’expression après le symbole   ;
  • La valeur retournée peut être de n’importe quel type8, Dr. Geo en affiche une représentation sous forme de chaîne de caractères ;
  • Si l’on souhaite retourner la valeur d’une variable, il suffit de mettre son nom après le symbole   .
Calculer des valeurs usuelles :

Pour calculer une valeur approchée de π :

pi
   ^ Float pi

ou de e :

e
   ^ Float e

Les valeurs retournées par ces scripts sont ensuite utilisables comme toutes les autres valeurs numériques que peut générer Dr. Geo. Pour toutes ces petites choses les scripts sont donc vos amis. Mais ils peuvent faire bien plus de choses intéressantes lorsqu’ils reçoivent des paramètres en entrée.

En effet ici les scripts n’avaient aucun argument, il n’y avait donc pas lieu de sélectionner des items de la figure lors de l’insertion des scripts dans la construction. Bien sûr leur intérêt réside dans les traitements numériques qu’ils permettent sur des items et la restitution de ce résultat dans la figure, sous la forme d’un objet qui lui même peut-être utilisé par d’autres scripts. Dans les sections suivantes nous montrerons de tels enchaînements de scripts.

Script avec un paramètre d’entrée

La procédure pour créer un script avec un paramètre d’entrée est sensiblement la même :

  1. Lors de l’édition du script ( Numériques>Éditer un script ), l’argument s’intercale dans le nom du script.
    Par exemple pour calculer la distance à l’origine d’un point, nous écrivons le script suivant :
    distanceToOrigin: item 
    "Retourne la distance à l'origine d'un point"
       ^ item point dist: 0@0
    

    Quelques explications :

  2. Lors de l’utilisation du script ( Numériques>Utiliser un script ), Dr. Geo attend que l’utilisateur clique sur un point, puis sur un emplacement de la figure.
    Attention, si un autre objet qu’un point est choisi, Dr. Geo génère une erreur, il suffit de fermer la fenêtre du débogueur et de sélectionner à nouveau le script pour recommencer.

Selon le type d’objet en référence, diverses méthodes sont disponibles ; qui pour obtenir sa valeur, qui pour obtenir ses coordonnées, etc. Le répertoire des méthodes est disponible depuis la section Méthodes de référence des scripts 4.2.2, p. ??.

Script avec deux paramètres d’entrée :

Supposons que nous souhaitions calculer la distance entre deux points, nous créons alors un script avec deux paramètres d’entrée, ils sont intercalés dans le nom du script. Celui-ci peut s’appeler distance:to: ; chaque “: “ designe l’emplacement d’un paramètre. Ainsi dans l’éditeur de script nous écrivons le code source suivant :

distance: item1 to: item2
"Calcule la distance entre deux points"
   ^ item1 point dist: item2 point

item1 et item2 sont les deux noms de nos paramètres, nous sommes libres de leur nommage. Pour utiliser ce script, procéder comment dans les exemples précédents : choisir deux points de la construction et un emplacement de la figure pour y placer le résultat du script.

Example détaillé de figure avec plusieurs scripts

Dans la section suivante, nous présentons une figure plus complexe intégrant un enchaînement de scripts pour la construction d’une portion de courbe représentative d’une fonction et la tangente en un point mobile de cette portion de courbe.

La figure finale est disponible dans le dossier examples de Dr. Geo, elle s’appelle Curve and slope.fgeo.


Figure 4.13: Courbe et tangente en un point

Dans une nouvelle figure, nous commençons par construire un segment horizontal, nous y plaçons un point libre appelé “Move me!”. Ce point servira de base à la construction de la courbe comme lieu d’un point.

Définir un fonction :

Comme un script est capable de retourner n’importe quel type d’objet, le premier de notre construction définira simplement la fonction utilisée. Pour ce faire nous utilisons des objets Smalltalk de type bloc de code – fonction anonyme en Lisp. Nous nommons ce script myFunction, sans paramètre :

myFunction
"La définition de notre fonction"
   ^ [:x | x cos]

Ensuite nous le plaçons dans la figure11. Ainsi le bloc de code retourné par myFunction attend un argument :x et retourne le cosinus de celui-ci. Nous verrons dans la suite comment manipuler ce script.

Image d’une valeur par une fonction :

Maintenant nous calculons les coordonnées d’un point appartenant à la courbe. Nous utilisons notre point “Move me!” et notre fonction. Le script aura comme unique argument le point ; comme nous allons le voir nous n’avons pas besoin du script myFunction en argument :

pointM: item
"Given a point calculate the y value from myFunction and the x valule of the point"
   ^ item point x @(self myFunction value: item point x)

Le point retourné par ce script a la même abscisse que le point de départ, son ordonnée est l’image par la fonction.

Noter :

Maintenant utilisons ce script pointM avec comme argument le point “Move me!” ; le résultat du script est de la forme 1.2@0.5, cela représente un couple de coordonées.

Avec l’outil point , créons un point ayant ses coordonnées contraintes par le résultat de ce script.

La fonction lieu d’un point donne la courbe en sélectionnant nos deux points.

Pente en un point d’une fonction :

Pour ce faire, nous calculons une valeur approchée de la pente :

p = 
f(x+0.001) − f(x)
0.001

Cela se traduit par un script slope: avec comment argument le point où calculer une approximation de la pente :

slope: item
"Compute the slope at the given x point position for myFunction"
| f  x |
   f := self myFunction.
   x := item point x.
   ^ (f value: x + 0.001) - (f value: x) / 0.001

Nous plaçons ensuite ce script dans la figure.

Noter :

Calculer et afficher la tangente à une courbe :

Pour construire notre tangente nous avons besoin de deux points : un sur la courbe – nous l’avons déjà – et un deuxième. Pour ce dernier nous utiliserons le calcul précédent de notre pente. Écrivons alors un script retournant les coordonnées d’un point sur la tangente :

pointN: item
"Given an initial point, calculate the coordinates of a point on the tangente"
| p x |
   p := self slope: item.
   x := item point x + 1.
   ^ x @ (item point y + p)

En utilisant le protocole de la classe Point, ce script s’écrit aussi en une ligne :

pointN: item
"Given an initial point, calculate the coordinates of a point on the tangente"
   ^ item point + (1@ (self slope: item))

Utilisons ce script avec comme argument le point de notre courbe. Nous obtenons un deuxième couple de coordonnées. Avec celles-ci construisons un point, la tangente est la droite définie par ce point et celui de la courbe.

En déplaçant le point “Move me!”, la tangente est recalculée. Tout aussi intéressant : modifier le script myFunction actualise correctement l’ensemble de notre construction. Quelques exemples de modifications :

   ^ [:x | x *x / 10]

   ^ [:x | x cos + (10 * x) sin]

   ^ [:x | (x *5) cos + x abs]

4.2.2  Méthodes de référence pour les scripts Dr. Geo

Un argument passé à un script est toujours une référence vers une instance de classe de la hiérarchie DrGMathItem, elle est le modèle de base pour représenter tout objet d’une figure. Ainsi pour connaître les messages compris par un argument d’un script, il convient d’examiner la hiérarchie de DrGMathItem. Celle-ci comprend plus de 80 classes, mais du fait des héritages, seules quelques unes sont intéressantes pour les usages courants des scripts :

Pour explorer ces classes, ouvrir un espace de travail – Ctrl-k après un clic sur le fond de l’environnement – y saisir et sélectionner le nom de la classe puis ouvrir le navigateur de classe par Ctrl-b.

Les sections suivantes contiennent la description de quelques messages pouvant être utiles. Elles sont présentées par classe.

Item Math

C’est le protocole de la classe DrGMathItem, il concerne tout argument, c’est à dire que les messages exposés ci-dessous s’appliquent à tous les types d’objets passés en argument à un script.


<string> item safeName
item : item mathématique
Retourne : une chaîne de caractères représentant le nom de l’item
Exemple :
nom := point1 safeName.
 nom asUppercase.



<boolean> item exist
item : item mathématique
Retourne : un booléen indiquant si l’item est dans un état permettant son existence
Exemple :
line exist ifTrue: [ position := line origin ].


<collection> item parents
item : item mathématique
Retourne : une collection des items parents de item
Exemple :
point1 := segment parents first.


item move: vector
Déplace item dans une direction donnée, tout en tenant compte de ses contraintes.

item : item mathématique
vector : un vecteur (x,y) représentant le déplacement
Exemple :
circle move: 2@1.


<point> item closestPointTo: aPoint
item : item mathématique
aPoint : un couple de coordonnées
Retourne : un couple de coordonnées du point de “item” le plus proche de “aPoint”.
Exemple :
position := item closestPointTo: 2@1.

Point


<point> item point
item : référence d’un point
Retourne : les coordonnées de ce point
Exemple :
abscissa := pointItem point x.


item point: aPoint
item : référence d’un point
aPoint : couple de coordonnées
Action : modifie les coordonnées de “item”
Exemple :
pointItem point: 5@2.


<float> item abscissa
item : référence d’un point libre sur une ligne
Retourne : abscisse curviligne de ce point, elle appartient à l’intervalle [0 ; 1]
Exemple :
a := pointItem abscissa.


item abscissa: a
item : référence d’un point libre sur une ligne
a : nombre décimal compris dans [0 ; 1]
Action : modifie l’abscisse curviligne d’un point libre sur une ligne
Exemple :
pointItem abscissa: 0.5.


point moveAt: aPoint
point : un item représentant un point géométrique
aPoint : un couple de coordonnées (x,y) où déplacer “point”
Action : déplace “point” à la position donnée
Exemple :
point moveAt: 2@1.

Ligne droite ou courbe


<float> curve abscissaOf: aPoint
curve : une ligne droite ou non
aPoint : un point (x,y)
Retourne : un nombre dans [0 ; 1] abscisse curviligne de “aPoint” sur “curve”
Exemple :
a := curve abscissaOf: 2@1.


<point> curve pointAt: anAbscissa
curve : une ligne droite ou non
anAbscissa : un nombre dans [0 ; 1]
Retourne : un point sur “curve” d’abscisse curviligne “anAbscissa”
Exemple :
myPoint := curve pointAt: 0.5.


<boolean> curve contains: aPoint
curve : une ligne droite ou non
aPoint : un point (x, y)
Retourne : un booléen indiquant si “aPoint” est sur “curve”
Exemple :
(curve contains: 0@1) ifTrue: [ ’Yes!’].

Droite, Demi-droite, Segment, Vecteur


<point> item origin)
item : référence vers un objet de type droite, demi-droite, segment ou vecteur
Retourne : un point origine de cet item
Exemple :
item origin.


<vector> item direction
item : référence vers un objet de type droite, demi-droite, segment ou vecteur
Retourne : un vecteur (x, y) indiquant la direction
Exemple :
v := item direction.
slope := v y / v x.



<vector> item normal
item : référence vers un objet de type droite, demi-droite, segment ou vecteur
Retourne : un vecteur unitaire normal à la direction de “item”
Exemple :
n := item normal.

Cercle, Arc de cercle, polygone


<point> item center
item : référence vers un cercle ou un arc de cercle
Retourne : point contenant les coordonnées du centre du cercle ou de l’arc de cercle
Exemple :
c := item center.


<float> item radius
item : référence vers un cercle ou un arc de cercle
Retourne : rayon du cercle ou de l’arc de cercle
Exemple :
r := item radius


<float> item length
item : référence vers un arc de cercle ou un polygone
Retourne : longueur de l’arc de cercle ou du polygone
Exemple :
l := arc length

Valeur


<float> item valueItem
item : référence vers un item de type valeur
Retourne : valeur de cet item
Exemple :
n1 := item2 valueItem.
n2 := item2 valueItem.
n1 + n2.



item valueItem: v
item : référence vers un item de type valeur libre
v : valeur décimale
Action : modifie la valeur d’un item de type valeur libre
Exemple :
item valueItem: 5.2.


item position: aPoint
item : référence vers un item de type valeur
aPoint : point (x, y)
Action : déplace à l’écran la position d’un item valeur
Exemple :
item position: 0.5@2.

Angle


<integer> angle degreeAngle
angle : référence vers un angle, orienté ou géométrique
Retourne : une mesure de cet angle en degrés
Exemple :
angle1 := a1 degreeAngle.


<float> angle radianAngle
angle : référence vers un angle, orienté ou géométrique
Retourne : une mesure de cet angle en radian
Exemple :
angle1 := a1 radianAngle.

4.3  Figure Smalltalk de Dr. Geo

Les Figures Smalltalk de Dr. Geo – (FSD) – sont des figures écrites en langage Smalltalk. Il ne s’agit donc plus de construire une figure à l’aide de l’interface graphique de Dr. Geo mais plutôt de décrire une figure dans le langage Smalltalk. Nous avons apporté le plus grand soin afin que la syntaxe utilisée soit facile et légère.

4.3.1  Quelques exemples

En lui-même Smalltalk est un langage de très haut niveau. Lorsqu’une figure est définie dans ce langage, nous disposons également de toute sa puissance pour par exemple définir récursivement telle partie de la figure, ou bien pour placer aléatoirement certains objets de telle sorte qu’à chaque ouverture de la figure, celle-ci est légèrement différente. Bref, les FSD sont libérées du carcan de l’interface graphique tout en étant renforcées par le langage Smalltalk.

Une FSD est un code source Smalltalk à exécuter dans un espace de travail – workspace. C’est une fenêtre texte depuis laquelle du code Smalltalk est écrit et exécuté. Pour ouvrir un tel espace, faire Ctrl-k lorsque aucune fenêtre n’est sélectionnée. On peut aussi y coller du texte par Ctrl-v.

Nous allons étudier plusieurs exemples, chacun d’eux sera écrit dans un workspace et exécuté en sélectionnant le code puis la séquence de touches Ctrl-d pour Do-it!

Commençons par étudier un exemple simple de FSD :

DrGeoCanvas new

C’est la plus petite FSD que nous puissions définir. Lors de son exécution, celle-ci va simplement créer une nouvelle figure vide. Le canevas Dr. Geo affiché est simplifié puisqu’il ne comporte ni barre de menu, ni barre d’outils. En revanche un menu contextuel s’affiche par un clic bouton droit ou gauche sur le fond du canevas ; il donne accès aux outils pour construire et éditer la figure. du canevas.

Pour déplacer ce canevas, l’attraper sur les bords en bas ou à droite ; pour le fermer, presser le bouton du milieu de la souris et utiliser l’icone fermer en haut à gauche.

Abordons un deuxième exemple :

| c item |
c := DrGeoCanvas new.
item := c point: 1.2 @ -2.
item name: 'A'.

Cette FSD définit une figure avec un point libre A de coordonnées initiales (1,2 ; −2). Les objets sont ajoutés à la figure à partir du canevas, ici point: crée un point libre à partir de deux coordonnées. Le résultat est un objet point, qu’il est possible de modifier, ici il est renommé ’A’.

Poursuivons avec un troisième exemple :

| c triangle hasard m n p |

triangle := [:p1 :p2 :p3 |
 c segment: p1 to: p2.
 c segment: p2 to: p3.
 c segment: p3 to: p1].
 
hasard := [5 - 10 atRandom].

c := DrGeoCanvas new.
m := c point: hasard value @ 0.
n := c point: 5 @ 0.
p := c point:  hasard value @ 3.
triangle value: m value: n value: p.

Cet exemple est particulièrement intéressant, il nous montre trois choses importantes :

  1. L’introduction d’une construction de plus haut niveau, non prévue au départ par Dr. Geo. Ici nous avons défini le bloc de code triangle qui, à partir de trois points, construit le triangle passant par ces trois points. Nous pouvons comparer ceci avec les macro-constructions mais avec un degré de liberté beaucoup plus important.
  2. La définition d’un bloc de code associé, ici nous avons défini hasard qui retourne un nombre entier compris entre -5 et 5. Nous utilisons ce bloc pour placer au hasard certains points de notre figure, ainsi à chaque exécution la figure est légèrement différente.
  3. L’affectation du résultat d’une construction à une variable n’est pas obligatoire, nous l’utilisons lorsque nous souhaitons garder une référence de l’objet créé. Par exemple dans le bloc de code triangle, nous ne gardons pas de référence des segments créés, en revanche lorsque nous définissons nos trois points nous avons besoin de garder une référence dans des variables temporaires. Ainsi, lors de l’utilisation du bloc de code triangle, nous passons en paramètre les variables m, n et p.

Pour clore cette section, voici un dernier exemple :

| c a b d |

c := DrGeoCanvas new.
a := c point: 1@0.
b := c point: 5@0.
d := c line: a to: b.
a color: Color yellow;
   round;
   large.
b hide.
d dashed.

Deux points et une droite sont créés. Ensuite des commandes sont utilisées pour modifier l’aspect des objets, voire pour en cacher.

Nous avons terminé notre petite visite guidée des Figures Smalltalk Dr. Geo. Dans les sections suivantes nous exposons l’ensemble des commandes disponibles pour définir des FSD.

4.3.2  Méthodes de référence pour les Figures Smalltalk Dr. Geo

La définition d’objets dans un document FSD se fait dans un canevas Dr. Geo. Les objets ainsi créés sont modifiables comme nous le verrons par la suite.

Cependant, avant toute définition d’objets d’une figure, cette dernière doit être créée avec la commande DrGeoCanvas new.

Commandes générales


<canvas> DrGeoCanvas new
Retourne : Retourne une référence vers un canevas et affiche celui-ci. Cette référence est nécessaire pour créer des objets dans ce canevas, il est donc important de la placer dans une variable.
Exemple :
| canvas |
canvas := DrGeoCanvas new.



canvas update
Action : Mise à jour du canevas après modification d’attributs de quelques items. La plupart du temps ce n’est pas nécessaire.


Point.

 

<point> canvas point: aPoint
aPoint : un couple de coordonnées (x,y)
Retourne : référence d’un point libre du plan de coordonnées initiales aPoint
Exemple :
canvas point: 5@2.


<point> canvas pointX: v1 Y: v2
v1 : un objet valeur
v2 : une objet valeur
Retourne : référence d’un point contraint par ses coordonnées
Exemple :
canvas pointX: (canvas freeValue: 2) hide Y: (canvas freeValue: 5) hide.


<point> canvas pointOnCurve: curve at: abscissa)
curve : référence d’une ligne (droite, demi-droite, segment, etc.)
abscissa : abscisse curviligne du point libre, la valeur appartient à l’intervalle [0 ; 1]
Retourne : référence d’un point libre sur une ligne
Exemple :
myPoint := canvas pointOnCurve: s1 at: 0.5.


<point> canvas middleOf: p1 and: p2
p1 : référence d’un point ou d’un couple de coordonnées
p2 : référence d’un point ou d’un couple de coordonnées
Retourne : référence du milieu des deux points
Exemple :
| a i |
a := canvas point: 1@1.
i := canvas middleOf: a and: 4@4.



<point> canvas middleOf: s
s : référence d’un segment
Retourne : référence du milieu du segment
Exemple :
canvas middleOf: s.


<point> canvas intersectionOf: l1 and: l2
l1 : référence d’une ligne
l2 : référence d’une ligne
Retourne : référence du point d’intersection des deux lignes
Exemple :
canvas intersectionOf: droite and: segment


<point> canvas altIntersectionOf: l1 and: l2
l1 : référence d’une ligne
l2 : référence d’une ligne
Retourne : référence de l’autre point d’intersection des deux lignes, lorsqu’il existe
Exemple :
canvas altIntersectionOf: droite and: circle.


<point> canvas point: bloc parent: item
bloc : bloc de code retournant un point
item : référence d’un item géométrique
Retourne : référence d’un point dont les coordonnées sont calculées avec le bloc de code ayant comme argument item
Exemple :

| figure s mobile c block |
figure := DrGeoCanvas new.
s:=figure
   segment: (figure point: -5@0)
   to: (figure point: 5@0).
mobile := figure pointOnCurve: s at: 0.1.
block := [:mathItem | |x|
   x := mathItem point x.
   x @ (x * x * x / 25 - x)].
c := figure point: block parent: mobile.
figure locusOf: c when: mobile.




<point> canvas point: bloc parents: itemCollection
bloc : bloc de code retournant un point
itemCollection : une collection d’items géométriques
Retourne : référence d’un point dont les coordonnées sont calculées avec le bloc de code ayant comme argument itemCollection
Exemple :

| figure a b d m p |
figure:=DrGeoCanvas new.
a:=figure point: (-2)@1.
b:=figure point: 3@3.
d:=figure line: a to: b.
d color: Color blue.
m:=figure point: 1@(-1).
p:= figure 
   point: [:parents | parents first closestPointTo: parents second point]
   parents: {d . m}.



Droite.

 

<line> canvas line: p1 to: p2
p1 : référence d’un point ou d’un couple de coordonnées
p2 : référence d’un point ou d’un couple de coordonnées
Retourne : référence d’une droite passant par deux points
Exemple :
| p1 |
p1 := canvas point: 0@0.
canvas line: p1 to: 1@2.



<line> canvas parallel: d at: p
p : référence d’un point ou d’un couple de coordonnées
d : référence d’une direction (droite, segment, vecteur, ...)
Retourne : référence d’une droite parallèle à la direction de d et passant par p
Exemple :
| a |
a := canvas point: 1@5.
canvas parallel: d at: a.



<line> canvas perpendicular: d at: p
p : référence d’un point ou d’un couple de coordonnées
d : référence d’une direction (droite, segment, vecteur, ...)
Retourne : référence d’une droite perpendiculaire à la direction de d et passant par p
Exemple :
canvas perpendicular: d at: 1@5.

Demi-droite.

 

<ray> canvas ray: o to: p
o : référence d’un point ou d’un couple de coordonnées, origine de la demi-droite
p : référence d’un point ou d’un couple de coordonnées, point de la demi-droite
Retourne : référence d’une demi-droite définie par son origine et un point
Exemple :
| a |
a := canvas point: 1@5.
canvas ray: 0@0 to: a.


Segment.

 

<segment> canvas segment: p1 to: p2
p1 : référence d’un point ou d’un couple de coordonnées
p2 : référence d’un point ou d’un couple de coordonnées
Retourne : référence d’un segment défini par ses extrémités
Exemple :
| a |
a := canvas point: 5@5.
canvas segment: 10@10 to: a.


Cercle.

 

<circle> canvas circleCenter: c to: p
c : référence d’un point ou d’un couple de coordonnées, centre du cercle
p : référence d’un point ou d’un couple de coordonnées, point du cercle
Retourne : référence d’un cercle défini par son centre et un point
Exemple :
| a |
a := canvas point: 1@5.
canvas circleCenter: a to: 10@4.



<circle> canvas circleCenter: c radius: r
c : référence d’un point ou d’un couple de coordonnées, centre du cercle
r : référence d’un item numérique ou d’une valeur numérique, rayon du cercle
Retourne : référence d’un cercle défini par son centre et son rayon
Exemple :
| a r |
a := canvas point: 1@5.
r := canvas freeValue: 4.
canvas circleCenter: a radius: r.
canvas circleCenter: 4@4 radius: 5


Arc de cercle.

 

<arc> canvas arc: p1 to: p2 to:p3
p1 : référence d’un point ou d’un couple de coordonnées, 1ere extrémité de l’arc
p2 : référence d’un point ou d’un couple de coordonnées de l’arc
p3 : référence d’un point ou d’un couple de coordonnées, 2eme extrémité de l’arc
Retourne : référence d’un arc de cercle défini par ses extrémités et un point
Exemple :
| a b |
a := canvas point: 1@5.
b := canvas point: 0@5.
canvas arc: a to: b to: -1 @ -2.


Polygone.

 

<polygon> canvas polygon: collection
collection : une liste de références de points ou de couples de coordonnées ; sommets du polygone
Retourne : référence d’un polygone défini pas ses sommets
Exemple :
| b |
b := canvas point: 1@3.
canvas polygon: {1@2. b. 0@0. d.}.


Les transformations géométriques.

 
Les transformations géométriques permettent la construction des tranformés d’objets. Elles s’appliquent à des références d’objets de type point, segment, droite, demi-droite, vecteur, cercle, arc de cercle et polygone.


<transformed item> canvas rotate: item center: centre angle: angle
item : point, segment, droite, demi-droite, vecteur, cercle, arc-cercle, polygone
objet : référence de l’objet à transformer
centre : référence d’un point ou d’un couple de coordonnées, centre de la rotation
angle : référence d’un item valeur ou d’une valeur, angle de la rotation
Retourne : référence de l’objet transformé
Exemple :
| c k l |
c := canvas point: 5@5.
k := 3.1415.
l := canvas line: 0@0 to: 5@5.
canvas rotate: l center: c angle: k.
canvas rotate: l center: 0@0 angle: Float pi / 3.



<transformed item> canvas scale: item center: centre factor: k
item : point, segment, droite, demi-droite, vecteur, cercle, arc-cercle, polygone
objet : référence de l’objet à transformer
centre : référence d’un point ou d’un couple de coordonnées, centre de l’homothétie
k : référence d’un item valeur ou d’une valeur, facteur de l’homothétie
Retourne : référence de l’objet transformé
Exemple :
| c k l |
c := canvas point: 5@5.
k := -3.
l := canvas line: 0@0 to: 5@5.
canvas scale: l center: c angle: k.
canvas scale: l center: 0@0 angle: 5.




<transformed item> canvas symmetry: item center: centre
item : point, segment, droite, demi-droite, vecteur, cercle, arc-cercle, polygone
centre : référence d’un point ou d’un couple de coordonnées, centre de la symétrie
Retourne : référence de l’objet transformé
Exemple :
| a |
a := canvas point: 4@2.
canvas symmetry: a center: 0@0.



<transformed item> reflect: item axe: axe)
item : point, segment, droite, demi-droite, vecteur, cercle, arc-cercle, polygone
axe : référence d’une droite, axe de la réflexion
Retourne : référence de l’objet transformé
Exemple :
canvas reflect: polygon axe: d1.


<transformed item> canvas translate: item vector: vecteur
item : point, segment, droite, demi-droite, vecteur, cercle, arc-cercle, polygone
vecteur : référence d’un vecteur ou d’un couple de coordonnées
Retourne : référence de l’objet transformé
Exemple :
| u a|
u := canvas vector: (canvas point: 1@1) to: (canvas point: 3@2).
a := canvas translate: (canvas point: 2@1) vector: u.

Exemple :
| u a|
a := canvas translate: (canvas point: 2@1) vector: 2@1.


Lieu d’un point.

 

<locus> canvas locusOf: c when: m
m : référence d’un point mobile sur une ligne
c : référence d’un point fixe dépendant du point m
Retourne : référence d’un lieu
Exemple :
canvas locusOf: p when: mobile.

Vecteur.

 

<vector> canvas vector: o to: e
o : référence d’un point ou d’un couple de coordonnées, origine du vecteur
e : référence d’un point ou d’un couple de coordonnées, extrémité du vecteur
Retourne : référence d’un vecteur
Exemple :
| b |
b := canvas point: 0@5.
canvas vector: b to: -1 @ -2.



<vector> canvas vector: p
p : référence d’un point ou d’un couple de coordonnées, coordonnées du vecteur
Retourne : référence d’un vecteur
Exemple :
| p |
p := canvas point: 5@5.
canvas vector: p.
canvas vector: -5 @ -5


Nombre.

 

<point> pointItem coordinates
pointItem : un point géométrique
Retourne : coordonnées (statiques) de pointItem
Exemple :
| c p |
p := canvas pointOnCurve: segment at: 0.5.
c := p coordinates.
c x



<value> canvas freeValue: v
v : la valeur initiale du nombre
Retourne : référence d’un nombre libre
Exemple :
canvas freeValue: (-1 arcCos).


<value> canvas lengthOf: segment | circle | arc | vector)
segment|circle|arc|vector : référence d’un segment, cercle, arc ou vecteur
Retourne : référence d’un nombre, longueur de l’item
Exemple :
canvas lengthOf: v1.


<value> canvas distance: line | point to: point2
line|point : référence d’une ligne ou d’un point
point2 : référence d’un point
Retourne : référence d’un nombre, distance entre deux points ou un point et une droite
Exemple :
canvas distance: l1 to: a.


<value> canvas slopeOf: line
line : référence d’une droite
Retourne : référence d’un nombre, pente de la droite
Exemple :
| p |
p := canvas slopeOf: d.


Angle.

 

<value> canvas angle: a to: b to: c
a : référence d’un point
b : référence d’un point, sommet de l’angle
c : référence d’un point
Retourne : référence d’un angle géométrique abc
Exemple :
canvas angle: a to: b to: c


<value> canvas angle: v1 to: v2
v1 : référence d’un vecteur
v2 : référence d’un vecteur
Retourne : référence d’un angle orienté formé par les deux vecteurs
Exemple :
| v1 v2 a |
v1 := canvas vector: a to: b.
v2 := canvas vector: a to: c.
a := canvas angle: v1 to: v2.


Modification d’attributs d’objets

Pour modifier les attributs d’un objet déjà créé, nous utilisons un système de messages envoyés directement à l’objet. La modification des attributs se fait donc toujours à posteriori.


item color: aColor
item : référence d’un objet
aColor : une instance de Color, voir ses méthodes de classe pour des définitions existantes : Color black, Color red, Color blue, Color orange, Color yellow,...
Action : modifie la couleur d’un item
Exemple :
pointA color: Color green.


item name: aString
aString : une chaîne de caractères
Action : renomme un item
Exemple :
segment name: ’[AB]’.


item hide
Action : masque un item



item show
Action : montre un item



line small
line : référence d’une ligne (droite, demi-droite, cercle, lieu, etc.)
Action : donne une épaisseur fine à une ligne
Exemple :
circle small.


line normal
line : référence d’une ligne (droite, demi-droite, cercle, lieu, etc.)
Action : donne une épaisseur normale à une ligne
Exemple :
arc normal.


line large
line : référence d’une ligne (droite, demi-droite, cercle, lieu, etc.)
Action : donne une épaisseur large à une ligne
Exemple :
polygon large.


line plain
line : référence d’une ligne (droite, demi-droite, cercle, lieu, etc.)
Action : donne un style ligne continue
Exemple :
polygon plain.


line dashed
line : référence d’une ligne (droite, demi-droite, cercle, lieu, etc.)
Action : donne un style en tirets à une ligne
Exemple :
polygon dashed.


line dotted
line : référence d’une ligne (droite, demi-droite, cercle, lieu, etc.)
Action : donne un style en pointillés à une ligne
Exemple :
arc dotted.


point cross
point : référence d’un point
Action : donne une forme en croix à un point
Exemple :
a cross.


point round
point : référence d’un point
Action : donne une forme en rond à un point
Exemple :
a round.


point square
point : référence d’un point
Action : donne une forme carrée à un point
Exemple :
a square.


point small
point : référence d’un point
Action : donne une petite taille à un point
Exemple :
a small.


point large
point : référence d’un point
Action : donne une taille large à un point
Exemple :
a large.


item moveTo: point
item : référence d’un point ou d’une valeur
point : couple de coordonnées
Action : déplace l’item à la position donnée, pour peu que cela ait un sens
Exemple :
| a |
a := canvas point: 0@0.
a moveTo: 5@5.
canvas update


4.3.3  Galerie d’exemples

Pour illustrer l’utilisation des Figures Smalltalk Dr. Geo, nous vous proposons une petite série d’exemples. Ceux-ci vous montrent leurs importantes possibilités et nous espérons qu’ils seront également une source d’inspiration. Pour chacun de ces exemples, nous donnons le code source Smalltalk de la figure puis son résultat. Le code source doit être copié dans un workspace de l’environnement de Dr. Geo puis exécuté.

Animer une figure

Ces exemples s’appuient sur la gestion du temps et celle des processus programmés en Smalltalk.

Un premier exemple simple pour comprendre le principe :

| figure p pause |
figure:=DrGeoCanvas new.
p := figure point: 0@0.
pause := Delay forSeconds: 0.2.
[100 timesRepeat: [
 p mathItem moveTo: (p mathItem point + (0.1@0)).
 figure update.
 pause wait]
] fork

Un deuxième exemple avec une figure plus élaborée :

| figure s r u pause |
figure:=DrGeoCanvas new.
s:=figure segment: (figure point: 0@(-1)) to: (figure point: 4@(-1)).
r:=figure pointOnCurve: s at: 0.8.
s:=figure segment: (figure point: 0@0) to: (figure point: 0@1).
u:=figure pointOnCurve: s at: 0.7.
u round small.
u color: Color blue.
1 to: 100 do: [:n|
       u:=figure point: [:parents| |y t|
        y:=parents first point y.
        t:=parents second point x.
        (n/5)@t*y*(1-y)] 
        parents:  {u.r}.
        u round small.
        u color: Color blue.
        ].
pause := Delay forSeconds: 0.1.
[0 to: 1 by: 0.05 do:[:x | 
 r mathItem setCurveAbscissa: x.
 figure update.
 pause wait]
] fork

Triangle de Sierpinski

Cet exemple s’appuie largement sur un bloc de code récursif.

| triangle c |
triangle := [:s1 :s2 :s3 :n |
    c segment: s1 to: s2;
        segment: s2 to: s3;
        segment: s3 to: s1.
    n > 0 ifTrue:
        [triangle
            value: s1
            value: (c middleOf: s1 and: s2) hide
            value: (c middleOf: s1 and: s3) hide
            value: n-1.
        triangle
            value: (c middleOf: s1 and: s2) hide
            value: s2
            value: (c middleOf: s2 and: s3) hide
            value: n-1.
        triangle
            value: (c middleOf: s1 and: s3) hide
            value: (c middleOf: s2 and: s3) hide
            value: s3
            value: n-1.]].

c := DrGeoCanvas new.
triangle
    value: (c point: 0 @ 3)
    value: (c point: 4 @ -3)
    value: (c point: -4 @ -3)
    value: 3.

Figure 4.14: Triangle de Sierpinski


1
Ou procédures pour les amateurs de Pascal.
2
Par exemple sous forme récursive
3
Cette contrainte a depuis été assouplie et permet d’aller encore plus loin avec les macro-constructions.
4
Article Smalltalk de Wikipédia en français (http://fr.wikipedia.org/wiki/Smalltalk). Page consultée le : 2 janvier 2011 15:47 UTC. Contenu soumis à la licence CC-BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/deed.fr).
5
Une traduction en français est en cours de finalisation.
6
Les macro-constructions ont une approche géométrique tandis que les scripts ont une approche numérique mais aussi et surtout nous pouvons les utiliser dans un esprit de bidouillage (“hacking” en anglais).
7
En particulier, les fonctions mathématiques.
8
Une instance de n’importe quelle classe pour être précis car les types n’existent pas en Smalltalk
9
Pour découvrir le protocole de cette classe, écrire son nom n’importe où dans l’environnement Dr. Geo, le sélectionner à la souris puis presser les touches Ctrl-b, un navigateur de classes s’affiche alors sur cette classe, il permet de naviguer et d’étudier son code source.
10
Comme le script ici son nom se termine par “:”
11
Il est important de le référencer dans la figure afin qu’il soit inclus dans la description de celle-ci lors d’une opération de sauvegarde sur fichier.

Previous Up Next