Aller au menu - Aller au contenu

Icône Conditions et boucles

Mise à jour : 01/07/2010
525 visites depuis 7 jours, dont 1 sur ce chapitre classé 218/786
Dans ce chapitre, vous apprendez à utiliser pleinement vos variables : les boucles et les conditions permettront à nouveau de réduire notre temps de travail !
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Condition

Les conditions classiques



En utilisant une condition, vous pouvez décider de n'utiliser une partie du code qu'à une condition (si une certaine variable vaut 3 par exemple, ou si elle est plus petite que 12, ...).

Les conditions ne fonctionnent qu'avec les nombres (éventuellement décimaux) ! Impossible donc de comparer des chaînes de caractères ou des objets.

Les différentes comparaisons possibles sont :
  • L'égalité, avec le signe "=" (un seul égal) : la condition sera vraie uniquement si les deux nombres comparés sont égaux.
  • L'inégalité, avec le signe "!=" : la condition sera vraie si les deux nombres sont différents.
  • La supériorité (ou l'infériorité) stricte, avec le signe ">" (ou "<") : la condition sera vraie uniquement si le premier nombre est strictement plus grand (ou plus petit) que le second.
  • La supériorité (ou l'infériorité) large, avec le signe ">=" (ou "<=") : la condition sera alors vraie si le premier nombre est plus grand (ou plus petit) ou égal au second.


Les conditions s'utilisent ainsi :
Code : Autre
1
2
3
4
5
#if (condition)
 
(...)
 
#end


ou bien
Code : Autre
1
2
3
4
5
6
7
8
9
#if (condition)
 
(...)
 
#else
 
(...)
 
#end



(En remplaçant condition par la condition en question, et en ajoutant quelque chose au milieu.)
Dans le deuxième cas, ce qu'il y a entre #if et #else sera utilisé si la condition est vraie ; ce qu'il y a entre #else et #end sera utilisé si la condition est fausse.

Voici un exemple :

Code : Autre
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "colors.inc"
 
#declare maSphere = sphere {
  <0,0,0>
  1
  pigment { Red }
};
 
#declare a = 3;
#if (a > 4)
  object {
    maSphere
  }
#end
 
#declare a = 5;
#if (a > 4)
  object {
    maSphere
    translate <2,0,0>
  }
#end


Au final, la deuxième sphère apparaîtra, mais pas la première. Facile à comprendre, non ? ;)

Notez bien les parenthèses autour de la condition : elles sont obligatoires.

Code : Autre
1
2
3
4
5
#if a < 3

(...)

#end

Ne fonctionnera pas !

Les conditions de déclaration



Il existe également un autre type de condition : on peut ainsi n'exécuter une partie du code que si une variable a déjà été définie (ou au contraire n'a jamais été définie), qu'elle que soit sa valeur.
Malgré son apparence relativement inutile, ce type de condition sera très utilisé si vous devez créer vos propres include. Vous vous souvenez du problème évoqué au chapitre précédent ? Le risque de déclencher une inclusion en boucle, ce qui pourrait causer un paradoxe spatio-temporel et ainsi détruire l'univers... et bien, avec ces conditions, aucun risque ! Regarder donc ce bout de code :
Code : Autre
1
2
3
4
#ifndef(mon_fichier_securite)
  #declare mon_fichier_securite = 1;
  (...)
#end

#ifndef(mon_fichier_securite) n'exécute le code qui suit que si la variable (ici mon_fichier_securite) n'a jamais été défini. Comme les conditions classique, il ne faut pas oublier les parenthèses autour de la condition, ni le #end à la fin.

Vous voyez ce qui va se passer ? La première fois que POV-Ray va entrer dans votre fichier pour le lire, la variable mon_fichier_securite n'existera pas, donc la condition sera vraie et le code sera lu. Mais la fois suivante, mon_fichier_securite aura la valeur 1, donc sera défini... Et le code sera simplement ignoré ! De cette manière, on évite d'être inclus une infinité de fois, ce qui peut vous sauver la vie :D
Je vous conseille d'utiliser cette ruse de sioux A CHAQUE FOIS que vous créer un fichier qui pourra être inclus plus tard. Même lorsque, en principe, il ne devrait être inclus qu'une seule fois. Mieux vaut prévenir que guérir ^^

Pour vérifier qu'une variable a déjà été définie, il faudra utiliser #ifdef(ma_variable) à la place de #ifndef(ma_variable).

Ignorer une partie de code



Souvent, vous aurez besoin d'ignorer purement et simplement une portion de votre scène, principalement afin de mener des tests. Bien qu'il soit tentant d'utiliser les commentaires pour cela, c'est très déconseillé.
A la place, utilisez une condition toujours fausse :
Code : Autre
1
2
3
4
5
6
7
8
9
10
11
12
13
sphere {
  // Cette sphère apparaîtra.
  <0,0,0>
  1
}

#if (0)
  sphere {
    // Celle-ci, non.
    <1,0,0>
    1
  }
#end

Boucles

Les boucles ressemblent un petit peu aux conditions, à une différence près : tant que la condition est remplie, ce qu'il y a dans le code sera répété.

Code : Autre
1
2
3
4
5
#while (condition)
 
(...)
 
#end


Ainsi, tant que condition sera vraie, le code situé entre #while et #end sera répété... Par exemple :

Code : Autre
1
2
3
4
5
6
7
8
9
#declare i = 3;
#while (i < 4)
 
sphere {
  <i, 0, 0>
  0.5
}
 
#end


Hey ! Mais... o_O quand est-ce que ça s'arrête alors ???

Ah ! :p Oui, dans ce cas, la boucle ne s'arrête jamais, car i (qui vaut 3) sera toujours inférieur à 4...

Pour utiliser les boucles, il faut OBLIGATOIREMENT que la variable testée puisse changer. Voici ce que l'on aurait pu faire :
Code : Autre
1
2
3
4
5
6
7
8
9
10
#declare i = 3;
#while (i < 4)
 
sphere {
  <i, 0, 0>
  0.5
}
#declare i = i + 1;
 
#end


Vous voyez ce qui va se passer ? A chaque passage dans la boucle, i va augmenter de 1... et va donc bien dépasser 4 à un moment ^^ :
  • #declare i = 3; --> i vaut 3.
  • #while (i < 4) --> La condition est vraie puisque i = 3, ce qui est inférieur à 4.
  • #declare i = i + 1; --> i vaut 3 + 1 = 4.
  • #end; --> On retourne juste au dessus de la boucle...
  • #while (i < 4) --> On a i = 4... Donc i n'est plus strictement inférieur à 4 ! La condition est donc fausse, on saute directement jusqu'à la fin, juste après le #end.

Il n'y a donc aucun problème, on peut bien sortir de la boucle. :D

Q.C.M.

Quelle boule apparaîtra ici ?

Code : Autre
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#declare variable = 3;
#declare rien = variable * 2 - 2;
#if (rien > variable)
    sphere {
      <0,1,0>
      1
      pigment { rgb <1,0,0>
    }
#else
    sphere {
      <0,-1,0>
      1
      pigment { rgb <0,1,0>
    }
#end
Ce code est-il correct pour un fichier qui sera inclus dans d'autres ?


Code : Autre
1
2
3
#ifdef ma_couleur
  #define jaune = pigment { rgb <1,1,0> }
#end
A quelle distance se trouve la sphère de l'origine <0,0,0> ?

Code : Autre
1
2
3
4
5
6
7
8
9
10
11
12
13
#declare i = 0;
#declare k = 0;

#while (i <= 5)
  #declare k = k+2;
  #declare i = i+1;
#end

sphere {
  <k, 0, 0>
  1
  pigment { rgb <1,0,0> }
}

Statistiques de réponses au QCM

Même si les boucles et les conditions ne devraient pas être nécessaires pour vos premières scènes, elles deviendront vite indispensables : imaginez en effet faire un bataillon de 100 soldats, un par un... >_<
Tout sela peut sembler un peu abstrait, et ça l'est, mais ne vous inquiétez pas... On va bientôt passer à l'application :D
Chapitre précédent Sommaire Chapitre suivant

Partager

Il n'y a pas encore de commentaire pour ce tuto.