Programmation dynamique de l'éponge de Menger

 Menger eclate

figure dynamique réalisée avec CaRMetal

NB : par « programmation dynamique » , on entend ici une programmation qui a lieu dans un environnement de GD et qui maintient des liens dynamiques dans les objets construits par programmation. Il ne s'agit pas de « programmation dynamique » au sens classique du terme.

On a vu comment programmer la construction de l'éponge de Menger avec CaRMetal dans cet article. Dans l’éponge de Menger obtenue à cette occasion, il n'y avait pas de lien dynamique (avec un point ou un curseur par exemple).
Dans le présent article, on va créer une éponge de Menger possédant un lien dynamique avec un curseur, ce qui change radicalement le type de programmation. L'algorithme sera identique, mais appliqué à un ADN de programmation différent : on va passer du nombre à la chaîne de caractères.


On va construire une éponge de Menger possédant un lien dynamique avec un curseur qui fixera le degré d’éclatement.

Reprenons le script de l'éponge de Menger.
Ce script comprend une fonction cube et une fonction récursive appelée menger.

script menger base

On va transmuter ce script.

1) On crée un curseur nommé "e" avec l'outil de la palette Contrôles.

controles
On modifie les paramètres de ce curseur pour le faire varier entre 1(pas éclaté) et 2(fortement éclaté).

barre curseur

2) On ajuste la fonction menger :

Une version non dynamique, mais qui tiendrait compte de la valeur de "e" au moment de l'exécution du script serait la suivante :

getExp

Mais pour que ce soit dynamique, il faut que x+i×c×2/3×e soit considéré comme une expression par CaRMetal, autrement dit que ce soit une chaîne de caractères qui corresponde à une expression, par exemple "2+3*e", auquel cas CaRMetal construit l'expression correspondante en interne.
Par conséquent, il faut écrire

progDyn 1

Remarque : la virtuosité en œuvre dans cette manipulation peut nécessiter de la pratique. Elle est essentielle à la programmation dynamique (à moins de passer par une surcouche comme dans un logiciel de Programmation Visuelle Par Bloc).

La fonction menger s'applique alors à des expressions (chaînes de caractères) x, y, z.
Il faut donc modifier la fonction cube pour qu'elle s'applique également à des expressions. Autrement dit, il faut écrire :

progDyn 2

Voici le script complet :

pseudo-code
fonction cube(x,y,z,c)
    P111 ⟵ Point3D(x+"+"+c,y+"+"+c,z+"+"+c)
    P011 ⟵ Point3D(x+"-"+c,y+"+"+c,z+"+"+c)
    P101 ⟵ Point3D(x+"+"+c,y+"-"+c,z+"+"+c)
    P110 ⟵ Point3D(x+"+"+c,y+"+"+c,z+"-"+c)
    P001 ⟵ Point3D(x+"-"+c,y+"-"+c,z+"+"+c)
    P100 ⟵ Point3D(x+"+"+c,y+"-"+c,z+"-"+c)
    P010 ⟵ Point3D(x+"-"+c,y+"+"+c,z+"-"+c)
    P000 ⟵ Point3D(x+"-"+c,y+"-"+c,z+"-"+c)
    Cacher(P111)
    Cacher(P011)
    Cacher(P101)
    Cacher(P110)
    Cacher(P001)
    Cacher(P100)
    Cacher(P010)
    Cacher(P000)
    faceD ⟵ Quadrilatère3D(P111,P011,P010,P110)
    faceG ⟵ Quadrilatère3D(P101,P001,P000,P100)
    faceH ⟵ Quadrilatère3D(P111,P011,P001,P101)
    faceB ⟵ Quadrilatère3D(P110,P010,P000,P100)
    faceAv ⟵ Quadrilatère3D(P111,P101,P100,P110)
    faceAr ⟵ Quadrilatère3D(P011,P001,P000,P010)
    MettreCouleurRVB(faceD,0,200,0)
    MettreCouleurRVB(faceG,0,100,0)
    MettreCouleurRVB(faceH,0,0,200)
    MettreCouleurRVB(faceB,0,0,100)
    MettreCouleurRVB(faceAv,200,0,0)
    MettreCouleurRVB(faceAr,100,0,0)

fonction menger(x,y,z,c,n)
    si n≤0
       cube(x,y,z,c)
    sinon
       pour var i allant de -1 à 1
          pour var j allant de -1 à 1
             pour var k allant de -1 à 1
                si abs(i)+abs(j)+abs(k)>1
                   menger(x+"+"+i+"*"+c+"*"+2/3+"*e",y+"+"+j+"*"+c+"*"+2/3+"*e",z+"+"+k+"*"+c+"*"+2/3+"*e",c/3,n-1)

menger(0,0,0,1,2)

Remarque : attention, entre guillemets il faut utiliser * et pas ×, et l'éditeur en mode pseudo-code peut avoir tendance à transformer automatiquement * par x quand l'écriture de nouveaux guillemets modifie temporairement le statut d'un passage entre guillemets. Vérifier à la fin et corriger si nécessaire.

On obtient le résultat suivant :

Menger eclate fin

(en accéléré pour la fin de la construction)

Pièces jointes :

Menger-dynamique.zir [figure CaRMetal]