Les nouvelles technologies pour l’enseignement des mathématiques
Intégration des TICE dans l’enseignement des mathématiques

MathémaTICE, première revue en ligne destinée à promouvoir les TICE à travers l’enseignement des mathématiques.

Construire une figure par récursivité avec CaRMetal 3.8.2
Article mis en ligne le 1er juillet 2013
dernière modification le 4 août 2018

par Patrice Debrabant

Une fonction qui contient un appel à elle-même est dite récursive.
La récursivité est un paradigme qui permet de construire efficacement certains objets (en particulier les figures fractales).

CaRMetal 3.8.2 implémente et intègre parfaitement la récursivité. Celle-ci peut s’exprimer sous sa forme la plus dépouillée dans des scripts dont l’ergonomie est optimale. On se propose de l’illustrer dans cet article.

Introduction

La refonte du CaRScript ExecuteMacro dans la version 3.8.2 parachève l’intégration logique des macros et des scripts JavaScript dans CaRMetal.
Cette intégration, pensée et réalisée par Eric Hakenholz, est une réussite éblouissante.

Petit rappel historique : avant la version 3.8.2, le CaRScript [1]
ExecuteMacro renvoyait seulement le nom du dernier objet final construit.
Cela avait le mérite de donner à ExecuteMacro une syntaxe identique à celle des CaRScripts constructeurs d’objets, mais ne respectait pas la logique de la macro : pour pouvoir utiliser les différents objets finaux d’une macro dans le script, il fallait construire autant de variantes de la macro initiale que d’objets finaux, ce qui compliquait les choses (la macro donnée à la fin de l’article pour construire un arbre de Pythagore en 3D a 36 objets finaux...).

Il y avait une incohérence. Celle-ci a été corrigée par les développeurs.
Je remercie à cette occasion Pierre-Marc Mazat, qui a œuvré à l’implémentation du CaRScript ExecuteMacro.

Le nouveau CaRScript ExecuteMacro renvoie :

  • le nom de l’objet final si cet objet final est unique ;
  • les noms de tous les objets finaux sous forme d’un tableau s’il y a plusieurs objets finaux.

Il est donc désormais possible de traduire parfaitement la macro dans le script.

L’intégration de CaRMetal va donner sa pleine mesure. On peut compartimenter très clairement (et de façon optimale) le travail :

  • les constructions compliquées sont réalisées dans l’interface de construction et converties en macro ;
  • le script gère le détail de la récursion.

Le script récursif aura (dans la plupart des cas) la forme très simple suivante :

Voyons ce que ça donne en pratique avec différentes figures :

1) Le flocon de Von Koch

* avec traitement dans les feuilles (courbe de Koch) :

Signalons ici un point important : l’ordre des objets dans le tableau n’est pas l’ordre des clics sur les objets finaux, il faut appliquer une fois la macro et observer l’ordre des objets dans le panneau de construction pour obtenir l’ordre effectif.


Nota Bene : ce point a été corrigé dans les versions ultérieures de CaRMetal, qui proposent la CaRCommande ExécuterMacroCommeDéfinie qui respecte l’ordre choisi lors de la construction de la macro. Par ailleurs, le panneau d’information des macros a été complété pour présenter l’ordre (dans ExécuterMacro et dans ExécuterMacroCommeDéfinie).


* avec traitement dans les branches :

Remarque : pour ce script, il faut d’abord créer les trois points A, B, C.

Version opaque (la macro ne change pas) :

Remarque : pour ce script, il faut d’abord créer les trois points A, B, C.

2) Fonction « brocoli »

Signalons que c’est Alain Busser qui m’a donné l’idée et permis de résoudre certains problèmes.

* avec traitement dans les feuilles (ce traitement fait appel à la macro) :

* avec traitement dans les branches :

3) « Carré spiralant »

On poursuit avec une macro intégrant un curseur.
Il s’agit de construire la figure du « carré spiralant ».

Remarques :

  • x est un curseur entre 0 et 0,2.
  • La macro a cinq initiaux : une expression, et les 4 sommets du carré.
  • La macro est créée en utilisant une expression, que l’on remplace ensuite dans le script par le curseur x.

4) Arbre de Pythagore

Il s’agit d’un traitement dans les branches.

a) Version simple :

Version simple opaque (la macro ne change pas) :

b) Variantes avec curseur :

On doit ces variantes à Yves Martin, qui m’a invité à aller plus loin que l’arbre de Pythagore classique.

On ajoute un objet initial à la macro : l’angle au centre que forme le sommet du triangle t[4] dans le cercle de diamètre [P1,P2].
Si cet angle vaut 90°, on obtient l’arbre de Pythagore équilibré classique.

* Version avec curseur simple :

* Version alternée avec curseur (la macro ne change pas) :

Pour cette version, on a opéré une petite modification dans le script : les curseurs/expressions ne sont pas des paramètres de la fonction arbre. C’est une possibilité si le curseur n’est pas modifié au cours de la récursion.
x est le curseur précédent.
y est une expression (masquée) qui vaut 180 – x.

Version opaque :

c) Variante 3D :

Il s’agit de construire un arbre de Pythagore en 3D en utilisant comme éléments une pyramide et trois prismes droits.
Voici le schéma de départ :

La macro théorique a pour initiaux les coeficients k, l et les 3 sommets du triangle (origines des vecteurs).
Elle a pour finaux les 9 points (extrémités des vecteurs) et les 9 rectangles tracés.

Seulement, on est en pseudo-3D, on va donc travailler avec les coordonnées 3D des points.

La macro théorique adaptée a pour initiaux les coeficients k, l et les 9 coordonnées des sommets du triangle initial.
Elle a pour finaux les 27 coordonnées des points et les 9 rectangles tracés.

Coefficient k : la hauteur de la pyramide est k x produit vectoriel
Coefficient l : la hauteur du prisme droit est l x produit vectoriel

Tout s’obtient par calcul analytique en 3D.
Quand on a obtenu les 27 coordonnées (finaux de la macro), on peut créer les points 3D, puis les rectangles (autres finaux).

A ce stade, on peut créer la macro, qui prendra aussi comme initiaux les point O, X, Y, Z dont dépendent les rectangles.
Cette macro fonctionne. Malheureusement, elle ne réussit pas l’examen de passage du CaRScript ExecuteMacro, le script génère une erreur...

On a donc décidé de recréer exclusivement en JavaScript le résultat théorique de ExecuteMacro, sans utiliser la macro et le passage par ExecuteMacro.
Vous pourrez trouver le détail de cette manipulation dans le script de la figure.

La fonction JavaScript MacroArbrePytha3D(...) joue le rôle de ExecuteMacro(« macro »,...) et on obtient alors le script suivant :

On a ajouté deux paramètres r et s qui contrôlent l’atténuation de k et l à mesure qu’on avance dans l’arbre.
ck est le curseur pour k, etc.

Vous trouverez en pièce jointe le fichier zirs avec le script qui génère l’arbre de Pythagore en 3D.