Création de labyrinthe pour povray

Contenu du snippet

ce code crée un fichier *.inc représentant un labyrinthe aléatoire généré en créant un ensemble de Tarjan. Ne vous sera utile que si vous avez déjà PovRay. On spécifie en dur dans le code la hauteur et la largeur.

Source / Exemple :


/* création de fichier include pour POV-Ray de défnition de labyrinthe 
par la méthode des ensembles de Tarjan*/

#include <stdio.h>

typedef enum{false, true}bool;

#define largeur 13
#define hauteur 14

bool murs[largeur+1][hauteur+1][2];  // 0: horizontal, 1: vertical
bool done[largeur+1][hauteur+1][2];
//                              > 0:horizontal, 1:vertical    

bool possible(int departx, int departy, int arriveex, int arriveey, int code)
{
     if ((departx==arriveex) && (departy==arriveey))
         return true;
     else
     {
          // en haut
          if (code!= 2) 
             {
                 if ((murs[departx][departy][0]==0) && (departy-1>=0))
                    if (possible(departx, departy-1, arriveex, arriveey, 1)) return true;
             }    
          // en bas
          if (code!=1)
             {
                 if ((murs[departx][departy+1][0]==0) && (departy+1<hauteur))
                    if (possible(departx, departy+1, arriveex, arriveey, 2)) return true;
             } 
          // à droite
          if (code!=4)
             {
                 if ((murs[departx+1][departy][1]==0) && (departx+1<largeur))
                    if (possible(departx+1, departy, arriveex, arriveey, 3)) return true;
             } 
          // à gauche
          if (code!=3)
             {
                 if ((murs[departx][departy][1]==0) && (departx-1>=0))
                    if (possible(departx-1, departy, arriveex, arriveey, 4)) return true;
             }     
          return false;
     }       
}    

main()
{
 
  
  int i,j,k;
  // initialisation du tableau à 1, on met des murs partout
  for (i=0; i<largeur+1; i++)
     for (j=0; j<hauteur+1; j++)
        for (k=0; k<2; k++)
             { murs[i][j][k]=1;
               done[i][j][k]=0;
             }    
  
  srand(time(NULL));
  unsigned long a_faire=(largeur-1)*hauteur+(hauteur-1)*largeur;
  bool choix;
  unsigned long nb_done=0;
  while (nb_done!=a_faire)
  {
      //on choisit un mur vertical ou horizontal
      // i : abscisse
      // j : ordoonée    
      do
      {
      choix=rand()%2;
      if (choix==0)
          {
              j=1+rand()%(hauteur-1);
              i=rand()%largeur;
          }       
      else
          {
              j=rand()%hauteur;
              i=1+rand()%(largeur-1);
          }
      }    
      while (done[i][j][choix]==1); 
  

      // on teste le mur i,j,choix
      if (choix==0)
          {
              if (!possible(i,j,i,j-1,0))
                 murs[i][j][0]=0;
              done[i][j][0]=1;
          }
      
      if (choix==1)
          {
              if (!possible(i,j,i-1,j,0))
                  murs[i][j][1]=0;
              done[i][j][1]=1; 
          }    
   nb_done++;
  
  }  // while pour tout le tableau  
   
FILE *fichier=fopen("labyrinthe.inc", "w");
fprintf(fichier, "union{\n");
for (i=0; i<largeur; i++)
  for (j=0; j<hauteur+1; j++)
    {
      if (((i==0) && (j==0)) || ((i==largeur-1) && (j==hauteur))) continue;
      if (murs[i][j][0])
        fprintf(fichier, "box{<%d,0,%2.1f>, <%d,1,%2.1f>}\n",i,j-.1, i+1,j+.1);   
    }    
         
for (i=0; i<largeur+1; i++)
  for (j=0; j<hauteur; j++)         
    {
      if (murs[i][j][1])
        fprintf(fichier, "box{<%2.1f,0,%d>, <%2.1f,1,%d>}\n",i-.1,j,i+.1,j+1); 
    }    
                    
fprintf(fichier, "pigment{Red}\n");
fprintf(fichier,"}\n");
fclose(fichier); 

}

Conclusion :


pour dessiner le labyrinthe sous PovRay, tapez le code suivant :

#include "colors.inc"

background { color White }

#declare cam_pos = <6,20,5>;

camera { perspective
location cam_pos
look_at <5,0,5>
}

light_source {cam_pos rgb 2 }
light_source {0 color rgb 2}
light_source {cam_pos+<0,1,0> rgb 0.4 }

#include "labyrinthe.inc"

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.