vers l'index général de l'aide
vers la page des macros

exemples de types courants de macros

objets particuliers

Une application très classique des macros, un objet particulier, complexe ou non, est généré à partir de quelques paramètres, de manière tout à fait linéaire (sans astuce de programmation).

//Pyramide (Nombre de cotes,Apotheme,Hauteur)
//posée sur xz, pointe en y
//(l'apothème, c'est le rayon du cercle inscrit dans la base)

#macro Pyramide (Nbfaces,Apot,Haut)
 #declare RotAngle=(360/Nbfaces);
 #declare AngHaut=degrees(atan2(Apot/Haut,1));
 #declare boucle=0;
 intersection {
 #while (boucle < Nbfaces)
   plane {x,0 rotate z*AngHaut translate x*Apot rotate y*RotAngle*boucle}
 #declare boucle=boucle+1;
 #end
 plane {y,0 inverse}
  }
#end

//utilisation, pyramide à 6 faces : 

object {Pyramide (6,10,15) pigment {Red}}

fonctions

Une macro peut également servir à retourner directement une valeur, en fonction des paramètres qui lui sont fournis, sans faire une "action".


//Voici une fonction qui, à l'endroit où on l'invoque,
//retourne la moyenne Arithmétique (0), Géométrique (1)
//ou Harmonique (2) de deux nombres

#macro Moyenne (Type,A,B)
     #switch (Type)
           #case (0) //moyenne arithmétique
             (A+B)/2 //remarquez que le résultat est placé tel quel, et agira comme
                     //une sorte de copier-coller à l'endroit où on utilisera la
           #break    //macro
           
           #case (1) //moyenne géométrique
             sqrt(A*B)
           #break  
           
           #case (2) //moyenne harmonique
             2/((1/A)+(1/B))
           #break  
           
           #else
              #warning "Attention, le type de moyenne est incorrect"
             0
                 //si le type est incorrect, la macro retourne 0 (pour ne pas
                 //bloquer le rendu) mais envoie un #warning
     #end                                             
#end

//usage, pour donner la hauteur d'un cylindre : 
   //(moyennes de 2 et 7)
cylinder {0,y*Moyenne (0,2,7),1 pigment {Red} translate x*0}
cylinder {0,y*Moyenne (1,2,7),1 pigment {Red} translate x*3}
cylinder {0,y*Moyenne (2,2,7),1 pigment {Red} translate x*6}

Récursivité

Dans certains cas, il est nécessaire qu'une macro fasse un appel à elle-même. C'est typiquement le cas des arbres et des structures fractales. POV-Ray permet sans problèmes à une macro de faire référence à elle-même. Toutefois, la maîtrise de ce type de structures de programmation nécessite de l'expérience et une certaine rigueur.

// d'après l'exemple pyramide de Chris Young (répertoires ../scene/macro)
#macro Mcr_Recursive ( X,Y,Z,R,L)  
        sphere {<X,Y,Z>R no_shadow }

   #if ( L > 0 )
     	 #local Nouv_L = L - 1;
     	 #local Nouv_R = R/2;
     	 #local Pos    = Nouv_R*3;
// ici se passe la récursivité ...
// on appelle la macro Mcr_Recursive avec de nouvelles valeurs
 	Mcr_Recursive(X+Pos,Y,Z,Nouv_R,Nouv_L)       	   
	Mcr_Recursive(X-Pos,Y,Z,Nouv_R,Nouv_L)       	   
	Mcr_Recursive(X,Y+Pos,Z,Nouv_R,Nouv_L)       	   
	Mcr_Recursive(X,Y-Pos,Z,Nouv_R,Nouv_L)
 Mcr_Recursive(X,Y,Z+Pos,Nouv_R,Nouv_L)
 	Mcr_Recursive(X,Y,Z-Pos,Nouv_R,Nouv_L)
   #end // fin if
#end // fin macro

// Appel de la macro dans le script principal
union {
  Mcr_Recursive(0,0,0,1,6)
  pigment { rgb <1,1,0> }
}
//et voilà !  une sorte d'éponge de Menger !

une fractale créée à l'aide d'une macro
C'est Zzouli, non ?

auteurs : Martial Rameaux / Fabien Mosen