Page 1 sur 1

unitrand()

MessagePosté: Dimanche 21 Janvier 2018, 17:40
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

Re: unitrand()

MessagePosté: Dimanche 21 Janvier 2018, 22:49
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);
   }
  }

Re: unitrand()

MessagePosté: Dimanche 21 Janvier 2018, 23:06
par zariski63
Je me doutais d un truc de ce style....
Merci beaucoup !!!!