vers l'index général de l'aide
vers la page des macros
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}}
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}
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 !
|
C'est Zzouli, non ?
|
auteurs : Martial Rameaux / Fabien Mosen