unitrand()

Tout ce qui concerne le langage Asymptote. Ce langage est supporté sur le forum via les balises asy.

Modérateur : gdm_asy

Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
zariski63
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 362
Inscription : jeudi 14 octobre 2010, 09:20

unitrand()

Message par zariski63 »

Bonsoir !
Je n'arrive pas à comprendre pourquoi mes hexagones ne changent pas de couleur à chaque compilation alors qu'à priori cette couleur varie aléatoirement ...
Surement bête mais ça m'échappe.

Merci
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

rebouxo
Modérateur global
Modérateur global
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Re: unitrand()

Message par rebouxo »

Bon un classique, il faut initialiser la graine. Asymptote a pris le parti du C, qui n'initialise pas la graine, ou plus exactement elle est initialisée toujours avec le même nombre (0 ?). La commande est srand(), et elle attend un entier, traditionnellement on fait appelle à l'heure du système et là c'est la commande seconds() qui renvoie un entier. Voili, voilou c'est joli.
Donc, cela donne :

Code : Tout sélectionner

settings.outformat="pdf" ;
import geometry;

unitsize(1cm);

real a=1;
pair pO=(0,0);
picture pic;


path polygone_regulier(int n)
{
  guide chemin;
  for (int i=1; i<=n; ++i)
    chemin=chemin--rotate((i-1)*360/n)*(a,0);
  return chemin--cycle;
}

// le motif
path motif=polygone_regulier(6);

srand(seconds()) ;

// et une double boucle pour "paver" suivant (Ox) et suivant (Oy)
real q=sqrt(3);
int n=5,m=5,j=0;
for(int i=0; i<n; ++i)
  {
  for(int j=0; j<m; ++j)
  {
    real r = unitrand() ;
    real g = unitrand() ;
    real b = 1 - g - r ;
    write(r,g,b) ;
    filldraw(shift((3*a)*i,q*j)*motif,
	     //unitrand()*red+unitrand()*green+unitrand()*blue);
    r*red+g*green+b*blue);
    }
  }
for(int i=0; i<n; ++i)
  {
   for(int j=0; j<m; ++j)
   {
     real r = unitrand() ;
     real g = unitrand() ;
     real b = 1 - g - r ;
     write(r,g,b) ;
   filldraw(shift((3*a)*i+1.5*a,q*j+0.5q)*motif,
	        r*red+g*green+b*blue);
   //unitrand()*red+unitrand()*green+unitrand()*blue);
   }
  }
A line is a point that went for a walk. Paul Klee.
Par solidarité, pas de MP.

zariski63
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 362
Inscription : jeudi 14 octobre 2010, 09:20

Re: unitrand()

Message par zariski63 »

Je me doutais d un truc de ce style....
Merci beaucoup !!!!