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"
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.