/* NAME = pissenlits.fonc */ /* 1989 (Michel BRET) revision 30-05_2005 (8.3) revision 2008 (9.2) revision 21-04-2017 revision 08-03-2018 */ /* Loop_Max > 0: loop */ /* pissenlits(n,loop) */ /* pissenlits("w"): Liste d'options. pissenlitsr(n): Demos predefinies. Les parametres modifiables sont dans la fonction INI_PIS() Il y a Nb_Pissenlit pissenlitss: Base=base d'un pissenlit Tige=tige Coeur=coeur de Np_Coeur points Akene: Nb_Akene akenes N1=Nb_Akene0*Nb_Akene0=place pour un pissenlit N0=N1*Nb_Pissenlit=place pour tous les pissenlits Pos=positions initiales des akenes Norm=normales initiales des akenes Ax=axes initiaux des akenes Num_Ciel=numeros des ciels NB_CIEL=nombre de ciels */ /* Capteurs */ /* -------- */ #define AUD 1 #define SOU 2 #define DAT 3 /* Types de ciel */ /* ------------- */ #define NB_CIEL 2 /* Effets */ /* ------ */ /* Pour ajouter un effet, si x est l'un des carateres libres j k l m n r t u w x y, il faut remplir le case XXX dans la fonction exec_EFF() et ecrire la fonction _x() */ #define NB_EFFETS 26 #define AUT 0 #define BRO 1 #define COU 2 #define DEF 3 #define EFF 4 #define FON 5 #define GAR 6 #define HEL 7 #define INI 8 #define JJJ 9 #define KKK 10 #define LLL 11 #define MMM 12 #define NNN 13 #define OEI 14 #define PAR 15 #define QUI 16 #define RRR 17 #define SPH 18 #define TTT 19 #define UUU 20 #define VER 21 #define WWW 22 #define XXX 23 #define YYY 24 #define ZER 25 /* Etat */ /* ---- */ #define ETAT_0 0 #define ETAT_1 1 #define ETAT_2 2 /* PROGRAMME PRINCIPAL */ /* =================== */ pissenlits(w,loop_max) { extern Loop_Cpt,Loop_Max if(loop_max==NIL) Loop_Max=0; else Loop_Max=90000*loop_max; /* loop */ Loop_Cpt=0; w=OPT_PIS(w); gen(); t=0,100,1; mes,= "\n"; mes =" LE PISSENLIT "; mes,=mes1,"\n"; mes,=" Michel Bret\n"; mes,=" 1990 (rev 2008, 2017)\n\n"; mes,=" Soufflez dans le micro\n\n"; interaction fonc(0,"F0")fonc(2,"F2")fonc(4,"F4")fonc(5,"F5") time(t)nom(mes) ; } /* EXTERNES */ /* ======== */ externes() { extern One extern Loop_Cpt,Loop_Max extern Verbose,Nom_Param,Roul,Sem_h,Sem_p,Sem_s,X1,Y1,X2,Y2,Kt,Kf,Film,Alias,Cpt_p extern Sem_Cadre,Rc,Vc,Bc,D_Cadre,Deux_Points,Option extern Type_Capteur,Valeur extern Ka,Dim_Audio,Vit,Moy,Moy_Vit extern Nom_DAT,I_DAT,Champ_DAT,D_DAT,NP_DAT,Dim_DAT,Coe_DAT,C_DAT,Y_DAT,Coe_AFF_DAT extern Sem_Ciel,Ciel,Num_Ciel,Nom_Ciel,R_Ciel extern Nom_IMA,Ext_IMA,Num_IMA,Sem_IMA extern Cpt_Cycle,Cpt_Interpol,Max_Interpol,I_Ciel extern Nb_Pissenlit,Inc,Base,Poi_Base,N_Base,N0,N1,Num_Vol extern Tige,Num_Tige,Nb_Tige,Np_Tige,Y_Tige extern Np_Coeur,Coeur,R_Coeur,Np_Reinit,Cpt_Reinit extern Akene,Akene1,Nb_Akene0,Nb_Akene,Num_Akene,L_Akene,Pos,Norm,Axe,Ang,Som,Permut,I_Permut,Na extern Cou,Col0,Transp,Col,Delai extern Z1_Brou,Z2_Brou,Z20_Brou,Cpt_Brou,R_Brou,V_Brou,B_Brou,Type_Brou extern Fond0,Fond,Nb_Fond,Tab_Fond extern Nom_Effets,Fonc_Effets,Sem_Effets,Flag_Effets,Nb_Effets_Prog,Cpt_Effets_Prog,Periode_Effets,Num_Effets_Prog extern Force,Multi,Balance,Masse,Raid,Visc0,Visc,Visc_Tige,D0,D,D3,Y_Pes,Pesanteur extern Cpt0,Cpt extern Oeil0,Xm,Ym,X_Mappe,Y_Mappe extern Nom_Image,I_Image extern Vent,An,DAn,D1 extern Nb_Oeil,Cpt_Oeil,Tab_Oeil extern Taille,X_Base,Y_Base,Z_Base extern Sem_Rapide extern Set_Akene,Cpt_start0,Cpt_start } /* OPTIONS */ /* ======= */ OPT_PIS(w) { #include "externes()" Option=w;INI_PIS(); /* Demo predefinie */ /* =============== */ One=0; switch(w) { case NIL: nn=nom fonc; $nn;$"(w): anyflo.9.2 version de janvier 2008";RC; $" cie: Pas de ciel\n"; $" pis=nombre de pissenlits (1 par defaut)\n"; $" ake=nombre d'akenes (automatique par defaut)\n"; $" tig=nombre de tiges (4 par defaut)\n"; $" ima=nom: Une image fixe\n"; $" ext=format (jpg, bmp, raw, ima)\n"; $" num=i1,i2: Numeros images\n"; $" def=n: Ciel par defaut\n"; $" sph=n: Ciel spherique\n"; $" aut=: Automatique\n"; $" bro: Brouillard\n"; $" fon: Fond\n"; $" oei: Oei\n"; $" eff: Effets programmes\n"; $" cou: variations couleurs\n"; $" xxx=x: X de la base\n"; $" yyy=y: Y de la base\n"; $" zzz=z: Z de la base\n"; $" tai=t: Taille des pissenlits\n"; $" rou=r: Roulis (c=0 par defaut, -3.14 vertical)\n"; $" par: lecture des parametres dans le fichier uti/param\n"; $" cad=r,v,b,d: cadre\n"; $" aud: audio (par defaut)\n"; $" sou: souris\n"; $" dat=fic.cap: fichier\n"; $" ver: Verbose\n"; $nn;$"(-1): 1 pissenlit sans ciel";RC; $nn;$"(0): 1 pissenlit";RC; $nn;$"(1): Demo";RC; goto fin; case 0: /* pissenlit0.js */ Option=w="pis=1 ake=30 def";Sem_Rapide=2;One=1; break; case 1: /* pissenlit1.js */ Option=w="ver pis=1 ake=30 def bro"; break; case 2: /* pissenlit_demo.js */ Option=w="pis=4 ake=25 gri def"; break; case 3: /* pissenlit_effets.js */ Option=w="pis=4 eff ake=23 def yfe=200 cfe=.6"; break; case 4: /* pissenlit_vertical.js */ Option=w="pis=4 ake=25 def rou=-3.14"; break; case 5: /* pissenlit_large.js */ Option=w="pis=3 ake=30 sph cou fon"; break; case 6: /* pissenlit_ima.js */ Option=w="pis=3 ake=25 sph oei cou fon ima=I.jpg"; break; case 7: /* pissenlit_perso.js */ Option=w="pis=3 ake=30 gri def sph cou fon"; break; /* pissenlit_param.js */ /* case 8: Option=w="pis=3 ake=30 par=param"; break; */ case 9: /* pissenlit_expo.js */ Option=w="pis=6 ake=25 def"; break; case 10: /* pissenlit_expo.js */ Option=w="pis=15 ake=20 def"; break; case 11: /* pissenlit_expo_20.js */ Option=w="pis=20 ake=20 def"; break; } w,=" cad=1,1,1,0"; /* Sans cadre */ message(0,1); $(nom fonc);$"(";$w;$")";RC; ini ini vol;non editer;ini image; /* Options */ /* ======= */ n=dim(w);k2=k1=0; while(1) { if(k1>=n)goto fin; while(1) { if(k2>=n)goto suite; if((w[k2])==" ")goto suite; k2++; } suite: w1=w[k1,k2-1];k2++;k1=k2; if(Verbose>0){$w1;RC;} n1=dim(w1);if(n1<3)return(erreur_option(w1)); w2=w1[0,2]; switch(w2) { case("cie"): /* Ciel */ if((v=lire_val(w1))!=NIL)Sem_Ciel=v; break; case("pis"): /* Nombre de pissenlits */ if((v=lire_val(w1))!=NIL)Nb_Pissenlit=v; break; case("ake"): /* Nombre d'akenes */ if((v=lire_val(w1))!=NIL)Nb_Akene0=v; break; case("tig"): if((v=lire_val(w1))!=NIL)Nb_Tige=v; break; case("ali"): Alias=1;break; case("ima"): if((v=lire_nom(w1))!=NIL)Nom_IMA=v;Sem_IMA=1; break; case("ext"): /* Exemples d'une image ima=I.jpg Exemples de sequence animee ima=d:/map/suzanne128/SUZ ext=bmp num=1500,2000 */ if((v=lire_nom(w1))!=NIL)Ext_IMA=v; break; case("num"): if((v=lire_val(w1))!=NIL)Num_IMA=v;Sem_IMA=dim(Num_IMA); break; case("def"): Flag_Effets[DEF]=1; break; case("sph"): /* Flag_Effets[SPH]=1;*/ _s(); break; case("aut"): Flag_Effets[AUT]=1;break; case("bro"): Flag_Effets[BRO]=1;break; case("fon"): Flag_Effets[FON]=1;break; case("oei"): Flag_Effets[OEI]=1;break; case("eff"): Flag_Effets[EFF]=1;break; case("cou"): Flag_Effets[COU]=1;break; case("ver"): Verbose=1;break; case("xxx"): if((v=lire_val(w1))!=NIL){X_Base[2]=X_Base[3]=v;} break; case("yyy"): if((v=lire_val(w1))!=NIL){Y_Base[2]=Y_Base[3]=v;} break; case("zzz"): if((v=lire_val(w1))!=NIL){Z_Base[2]=Z_Base[3]=v;} break; case("tai"): if((v=lire_val(w1))!=NIL)Taille=v; break; case("rou"): if((v=lire_val(w1))!=NIL)Roul[2]=Roul[3]=v; break; case("par"): if((v=lire_nom(w1))!=NIL)Nom_Param=v;else Nom_Param="param"; /* w=clean(lire(Nom_Param));exec(w);*/ break; case("cad"): Sem_Cadre=1; if((v=lire_val(w1))!=NIL) { Rc=v[0];nv=dim(v); if(nv>1)Vc=v[1]; if(nv>2)Bc=v[2]; if(nv>3)D_Cadre=v[3]; } break; } if(k1>=n)break; } fin: set_parametres(); } set_parametres() { #include "externes()" /* Dimensions */ /* ---------- */ if(Nb_Pissenlit>50)Nb_Pissenlit=50; if(Nb_Akene0<4)Nb_Akene0=4; /*Oeil0=0,.1,-.6;*/ Oeil0=0,0,-.6; message(0,1); Verbose0(nom fonc); /* Numeros des objets */ /* ------------------ */ Inc=1000; /* Pissenlit(i+1)=Pissenlit+Inc */ Akene1=1; Base=2; Tige=3; Coeur=Tige+Nb_Tige; Akene=Coeur+1; Ciel=1000000; for(i=0,NB_CIEL-1)Num_Ciel[i]=Ciel+i; Na=0; /* Nombre d'akenes arrachees */ Num_Tige=Tige+[0,Nb_Tige-1]; _i(0); Nom_Image="P";I_Image=1; } /* INITIALISATIONS */ /* =============== */ INI_PIS() { #include "externes()" Cpt_p=0;Sem_Rapide=0; Nom_Param="param"; Taille=.5,2,1,1; /* Taille */ X_Base=-2,2,0,0; /* X de la base */ Y_Base=0,2,.9,.9; /* Y de la base */ Z_Base=-2,-1,-.5,-.5; /* Z de la base */ /* Couleurs texte fond */ Kt=1,1,0;Kf=0,0,0; /* Pissenlit */ /* --------- */ Nb_Pissenlit=1; /* Nombre de pissenlits */ Nb_Akene0=12; /* Nombre d'akenes d'un pissenlit */ Nb_Tige=12; /* Nombre de segments d'une tige */ /* Ciels */ /* ----- */ Sem_Ciel=1; Num_Ciel=calloc(NB_CIEL); Nom_Ciel="def sph"; I_Ciel=0; Periode_Effets=10,1000,100,100; /* Cycles */ /* ------ */ Cpt_Cycle=0; /* Changement */ I_Cycle0=0; /* Precedent */ I_Cycle=0; /* Actuel */ Cpt_Interpol=0; Max_Interpol=2,200,50,50; /* Interpol aut */ /* Brouillard */ /* ---------- */ Type_Brou=1; set_brou(); Verbose=Deux_Points=-1; /* Dimensions */ R_Ciel=1500; Y_Tige=.3*R_Ciel; R_Coeur=.01*R_Ciel; L_Akene=.01*R_Ciel; Col0=0,1,0,0,.99,0,0; /* Filaire */ Transp=0,1,.25,.25; Col=2,1,.1,.1,(Transp[2]),0; /*Fondu=.005,.1,.05,.05;*/ Delai=2,500,25,25; /* Effets a b c d e f g h i o p q s v */ /* ---------------------------------- */ Flag_Effets=calloc(NB_EFFETS,-1);Sem_Effets=NIL; Nom_Effets ="aut ";Sem_Effets =1; /* automatique */ Nom_Effets,="bro ";Sem_Effets,=1; /* brouillard */ Nom_Effets,="cou ";Sem_Effets,=1; /* couleur */ Nom_Effets,="def ";Sem_Effets,=1; /* ciel par defaut */ Nom_Effets,="eff ";Sem_Effets,=1; /* effets */ Nom_Effets,="fon ";Sem_Effets,=1; /* fond */ Nom_Effets,="gar ";Sem_Effets,=1; /* gare image */ Nom_Effets,="hel ";Sem_Effets,=1; /* help */ Nom_Effets,="ini ";Sem_Effets,=1; /* init parametres */ Nom_Effets,="jjj ";Sem_Effets,=0; /* Libre */ Nom_Effets,="kkk ";Sem_Effets,=0; /* Libre */ Nom_Effets,="lll ";Sem_Effets,=0; /* Libre */ Nom_Effets,="mmm ";Sem_Effets,=0; /* Libre */ Nom_Effets,="nnn ";Sem_Effets,=0; /* Libre */ Nom_Effets,="oei ";Sem_Effets,=1; /* oeil */ Nom_Effets,="par ";Sem_Effets,=1; /* parametres */ Nom_Effets,="qui ";Sem_Effets,=1; /* quitter */ Nom_Effets,="rrr ";Sem_Effets,=0; /* Libre */ Nom_Effets,="sph ";Sem_Effets,=1; /* ciel spherique */ Nom_Effets,="ttt ";Sem_Effets,=0; /* Libre */ Nom_Effets,="uuu ";Sem_Effets,=0; /* Libre */ Nom_Effets,="ver ";Sem_Effets,=1; /* verbose */ Nom_Effets,="www ";Sem_Effets,=0; /* Libre */ Nom_Effets,="xxx ";Sem_Effets,=0; /* Libre */ Nom_Effets,="yyy ";Sem_Effets,=0; /* Libre */ Nom_Effets,="zer";Sem_Effets,=1; /* zer effets */ Fonc_Effets="_a _b _c _d _e _f _g _h _i _j _k _l _m _n _o _p _q _r _s _t _u _v _w _x _y _z"; /* Fond */ /* ---- */ Fond0=0,0,0; /* Images */ /* ------ */ Nom_IMA=Ext_IMA=Num_IMA=NIL;Sem_IMA=0; /* Pas d'images */ /* Audio */ /* ----- */ Dim_Audio=256;D3=Moy=D=D0=0; Valeur=0; Ka=0,10,3,3; /* Dynamique */ /* --------- */ Masse=1; Force=0,10,4,4; /* Forced'arrachement */ Multi=0,15,7.5,7.5; /* Multiplicite des akenes arrachees */ Balance=0,5,.25,.25; /* Balancement des tiges */ Y_Pes=0,1,.25,.25; /* Pesanteur */ Pesanteur=0,Y_Pes,0; Raid=.00025; /* Ressort tige et ciel */ Visc_Tige=-.05; /* Viscosite tige */ Visc0=-.05; /* Descente */ Visc=-.001; /* Montee */ Vent=0,1,.1,.1; /* Vent aleatoire */ An=0;DAn=.1; Roul=-3.14,3.14,0,0; /* Roulis -3.14: ecran vertical */ Film=0; Type_Capteur=AUD; Nom_DAT="continu_rigide_2.tab.cap";NP_DAT=Dim_DAT=I_DAT=0; D_DAT=-10,10,4,4; Coe_DAT=0,2,.33,.33; Y_DAT=-1,1,0,0; Champ_DAT=-1,0,0,0; C_DAT=2,1000,100,100; /* Capture */ Coe_AFF_DAT=-50,50,-25,-25; Cpt=Cpt0=50; /* Avant reinitialisation */ Nb_Oeil=0; Sem_Rapide=0;Alias=0; /* Cadre */ Sem_Cadre=0;Rc=Vc=Bc=1;D_Cadre=20; Etat=ETAT_0; /* Courant */ } /* GENERATION */ /* ========== */ gen() { #include "externes()" $"-gen\n"; gen_base();gen_tige();gen_Coeur();gen_akene();anc_pissenlit();set_cou(1); if(Sem_Ciel)gen_Ciel(); ini_capteur();gen_image(); init_Effets_Progr(); inc=0; Num_Vol=NIL; for(i=1,Nb_Pissenlit) { Num_Vol,=([Tige,Tige+Nb_Tige-1],[Akene,Akene+Nb_Akene-1],Coeur)+inc; inc+=Inc; } $"+gen\n"; } /* Ciel */ /* ---- */ gen_Ciel() { Verbose0(nom fonc); gen_Ciel_def(); gen_Ciel_sph(); } gen_Ciel_def() { #include "externes()" Verbose0(nom fonc); f=Num_Ciel[0]; grille(1,1,1)numero(f); cou vol(f)=1,1,1;col vol(f)=2,1,.1,.1,0,0; set_nom(f,("Ciel_defaut")); set_par(f,0,(1,1,1)); } gen_Ciel_sph() { #include "externes()" nc=12; Verbose0((nom fonc),nc); f=Num_Ciel[1]; rev(nc,PI)numero(f); poi(arc(R_Ciel,-.5*PI,PI,nc)); fin; rotz vol(f)ang(PI); set_nom(f,"Ciel_spherique"); set_par(f,.2,(1,1,1)); } set_par(ciel,c,k) { extern Col r=1;v=.9;b=.7; cou vol(ciel)=(k[0])*(r+rand2f(0,c)), (k[1])*(v+rand2f(-c,c)), (k[2])*(b+rand2f(-c,c)); col vol(ciel)=Col; mappe vol(ciel)=1,2; } /* Base */ /* ---- */ gen_base() { #include "externes()" for(i=0,Nb_Pissenlit-1) { Verbose0((nom fonc),i); f=Base+i*Inc; vol numero(f);fin; set_nom(f,("Base",chaine(i+1))); } Poi_Base=calloc(3*Nb_Pissenlit); N_Base=calloc(Nb_Pissenlit); } /* Tige */ /* ---- */ gen_tige() { #include "externes()" for(ip=0,Nb_Pissenlit-1) { Verbose0((nom fonc),ip); inc=ip*Inc;tige=Tige+inc;base=Base+inc;num_tige=Num_Tige+inc; y=-Y_Tige*rand2f(.75,1.25)/Nb_Tige; for(i=0,Nb_Tige-1) { f=tige+i; vol numero(f);poi(0,0,0);poi(0,y,0);fac(1,2);fin; col vol(f)=Col0;cou vol(f)=1,1,1; set_nom(f,("Tige",chaine(ip+1,i+1))); if(i==0) ressort ang vol(f)=Raid,Visc_Tige,base; else ressort ang vol(f)=Raid,Visc_Tige,f-1; c=i*PI/Nb_Tige;limite rota vol(f)=-c*PI,c*PI; } masse vol(num_tige)=Masse;force rota vol(num_tige)=0,0,0,Visc; } } /* Coeur */ /* ----- */ gen_Coeur() { #include "externes()" n=6;nc=100;Np_Coeur=20; p=arc(R_Coeur,0,-2*PI,Np_Coeur); for(ip=0,Nb_Pissenlit-1) { Verbose0((nom fonc),ip); coeur=Coeur+ip*Inc; vol numero(coeur);poi(p);fin; set_nom(coeur,("Coeur",chaine(ip+1))); col vol(coeur)=0,1,10,50,0,0; set_nom(coeur,"Coeur"); } } set_cou(sem,num) { #include "externes()" Cou=calloc(3*Nb_Pissenlit); for(i=0,Nb_Pissenlit-1)Cou{i}=rand2f(.85,1),rand2f(.6,.85),rand2f(.35,.6); inc=0;c=1,1,1; if(num==NIL) {ip1=0;ip2=Nb_Pissenlit-1;} else {ip1=ip2=num;} for(ip=ip1,ip2) { coeur=Coeur+inc;akene=(Akene+[0,Nb_Akene-1])+inc; if(sem)c=Cou{ip}; cou vol(coeur)=.75*c; cou vol(akene)=c; inc+=Inc; } } /* Akenes */ /* ------ */ gen_akene() { #include "externes()" N1=Nb_Akene0*Nb_Akene0+100; N0=N1*Nb_Pissenlit; Norm=Pos=calloc(3*N0); Axe=calloc(3*N0); Ang=calloc(N0); na=6;d=.5*L_Akene; p0=arc(d,.5*PI,2*PI*(na-1)/na,na);roty var("p0")ang(-.5*PI);dep var("p0")poi(L_Akene+.25*d,0,0); R2=R_Coeur*R_Coeur;na=4;d=L_Akene;c=.1*R_Coeur; n1=0; for(ip=0,Nb_Pissenlit-1) { Verbose0((nom fonc),ip); inc=ip*Inc;akene=Akene+inc;Nb_Akene=0; coeur=Coeur+inc; y1=R_Coeur;y2=-R_Coeur;dy=(y2-y1)/(Nb_Akene0-1); for(y=0,Nb_Akene0-1) { n=1+Nb_Akene0*sin(y*PI/(Nb_Akene0-1)); r=sqrt(abs(R2-y1*y1)); p0=arc(r,PI,-PI,n);rotx var("p0")ang(-.5*PI);p0+=(0,y1,0);y1+=dy; alea var("p0")coe(c); for(x=0,n-1) { p=p0{x}; vol numero(akene); poi[1,6];fac(1,2); for(i=3,na+2) {poi(0,0,0);fac(2,i);} fin; akene++;Nb_Akene++; } } num_akene=[Akene,Akene+Nb_Akene-1]+inc; for(i=0,Nb_Akene-1) { f=num_akene[i]; col vol(f)=Col0; } n1+=N1; } if(Nb_Pissenlit==1) Np_Reinit=Nb_Akene; else {if((Np_Reinit=Nb_Akene/Nb_Akene0)<1)Np_Reinit=1;} Cpt_Reinit=calloc(Nb_Pissenlit,-1); init_akene(); dup vol(Akene)numero(Akene1); masse vol(Akene1)=1;force rota vol(Akene1)=0,0,0,-.1;force vol(Akene1)=Pesanteur,-.1; cou vol(Akene1)=1,1,1; an=-PI;dan=PI/(Nb_Akene0-1);k=0; for(y=0,Nb_Akene0-1) { n=1+ent(Nb_Akene0*sin(y*PI/(Nb_Akene0-1))); for(j=0,n-1){Ang[k]=an;k++;} an+=dan; } Num_Akene=Akene+[0,Nb_Akene-1]; Permut=calloc(Nb_Akene*Nb_Pissenlit,1);I_Permut=calloc(Nb_Pissenlit);inc=0; for(i=0,Nb_Pissenlit-1) { Permut[inc,inc+Nb_Akene-1]=permutation(Nb_Akene,0); inc+=Nb_Akene; } } init_akene() { #include "externes()" R2=R_Coeur*R_Coeur;na=4;d=L_Akene;c=.1*R_Coeur; n1=0; for(ip=0,Nb_Pissenlit-1) { Verbose0((nom fonc),ip); inc=ip*Inc;akene=Akene+inc;nb_akene=0; coeur=Coeur+inc; y1=R_Coeur;y2=-R_Coeur;dy=(y2-y1)/(Nb_Akene0-1); for(y=0,Nb_Akene0-1) { n=1+Nb_Akene0*sin(y*PI/(Nb_Akene0-1)); r=sqrt(abs(R2-y1*y1)); p0=arc(r,PI,-PI,n);rotx var("p0")ang(-.5*PI);p0+=(0,y1,0);y1+=dy; alea var("p0")coe(c); for(x=0,n-1) { p=p0{x}; Pos{nb_akene+n1}=p;u=unitaire(p);Norm{nb_akene+n1}=2*u; v=vectoriel(0,-1,0,u); Axe{nb_akene+n1}=unitaire(vectoriel(0,-1,0,u)); poi(1)vol(akene)=0,0,0;p=2*L_Akene*u;poi(2)vol(akene)=p; v=u[1],-u[0],0;p1=d*v+d*u;day=2*PI/na; for(i=3,na+2) {poi(i)vol(akene)=p+p1;rota var("p1")ang(day)axe(u);} akene++;nb_akene++; } } n1+=N1; } } /* Ancrage */ /* ------- */ anc_pissenlit() { #include "externes()" incp=0; for(ip=0,Nb_Pissenlit-1) { inc=ip*Inc;tige=Tige+inc;base=Base+inc; coeur=Coeur+inc;akene=Akene+inc; g=poi(1)vol(tige);lead(base)poi(0,0,0)suiv(tige)poi(g); for(i=1,Nb_Tige-1) { f=tige+i-1;g1=poi(2)vol(f);g2=poi(1)vol(f+1); lead(f)poi(g1)suiv(f+1)poi(g2); } f=tige+Nb_Tige-1; g1=poi(2)vol(f);g2=(0,R_Coeur,0); lead(f)poi(g1)suiv(coeur)poi(g2); Som=calloc(Nb_Akene);np=(NP vol(coeur))+1; for(i=0,Nb_Akene-1) { f=akene+i; lead(coeur)poi(Pos{i})suiv(f)poi(0,0,0); Som[i]=np+i; } valider(1)poi vol(coeur); masse vol(coeur)=Masse;masse som(Som)vol(coeur)=Masse;vitesse som(Som)vol(coeur)=0,0,0; force som(Som)vol(coeur)=0,0,0,Visc; incp+=Nb_Akene; } } gen_image() { #include "externes()" switch(Sem_IMA) { case 0: /* Pas d'image: Auto mapping */ d=dim ecr;x0=d[0];y0=d[1];X_Mappe=2048;Y_Mappe=2048; while(X_Mappe>x0)X_Mappe/=2;while(Y_Mappe>y0)Y_Mappe/=2; generer(127,127)image(2); image numero(2)image(X_Mappe,Y_Mappe)numero(1); break; case 1: /* Une image */ nn=Nom_IMA; lire image(nn)numero(1); X_Mappe=Y_Mappe=0; break; case 2: /* Sequence animee */ nn=Nom_IMA,chaine("4D",Num_IMA[0]),".",Ext_IMA; lire image(nn)numero(1); break; default: X_Mappe=Y_Mappe=0; } } /* CAPTEURS */ /* ======== */ ini_capteur() { #include "externes()" switch(Type_Capteur) { case AUD: audio ini(Dim_Audio); break; case SOU: break; case DAT: v=periph(1)valider; if(v!=NIL)fin periph(1); periph(1)ini("DAT")nom(Nom_DAT); NP_DAT=periph(1)NP;Dim_DAT=periph(1)dim;I_DAT=0; Champ_DAT[1]=Dim_DAT-1; if((Champ_DAT[2])>=Dim_DAT)Champ_DAT[2]=Dim_DAT-1; break; } } /* INTERACTION */ /* =========== */ /* Initialisations */ /* --------------- */ F0() { #include "externes()" /* Caracteres speciaux */ /* ------------------- */ interaction ascii("h")fonc("_h"); interaction ascii("i")fonc("_i"); interaction ascii("g")fonc("_g"); interaction ascii("p")fonc("_p"); interaction ascii("s")fonc("_s"); interaction ascii(":")fonc("_deux_points"); interaction ascii("q")fonc("_q"); interaction ascii("v")fonc("_v"); interaction ascii("z")fonc("_z"); /* Effets */ /* ------ */ A=ascii("A");a=ascii("a"); for(i=0,NB_EFFETS-1) { nn=Nom_Effets{i};c=nn[0];ff="_",c; interaction ascii(c)fonc(ff); } /* Flags */ /* ----- */ if(Flag_Effets[BRO]>0) {interaction oui brou;Type_Brou=1;} interaction moyenne(12)nom("D"); interaction moyenne(25)nom("Moy"); interaction moyenne(12)nom("Moy_Vit"); interaction moyenne(50)nom("D3"); set_pissenlit_0(); INIT(); if(Sem_IMA>1) { /* Lire la sequence d'images */ $"interaction lire image(",Nom_IMA;$")ext(",Ext_IMA;$")numero ",chaine(Num_IMA);RC; interaction lire image(Nom_IMA)ext(Ext_IMA)numero(Num_IMA)periode(1000000)mappe(1); } /* Roulis */ set_roul(); if(Alias)interaction alias(0); interaction valider(0)menu; det_dim(); if(Flag_Effets[DEF]>0)interaction valider(1)vol(Num_Ciel[0]); if(Flag_Effets[SPH]>0)interaction valider(1)vol(Num_Ciel[1]); w=clean(lire(Nom_Param));exec(w); for(i=0,NB_EFFETS-1) { if(Flag_Effets[i]>0)exec_EFF(i); } } set_pissenlit_0() { #include "externes()" if(Nb_Pissenlit==1) Poi_Base=0,0,0; else { r=.25*R_Ciel; Poi_Base=calloc(3*Nb_Pissenlit); for(i=0,Nb_Pissenlit-1)Poi_Base{i}=rand2f(-r,r),0,rand2f(-r,r); } if(Nb_Pissenlit==1) p=0,0,0; else { r=.25*R_Ciel; Poi_Base=calloc(3*Nb_Pissenlit); for(i=0,Nb_Pissenlit-1)Poi_Base{i}=rand2f(-r,r),0,rand2f(-r,r); } set_pissenlit();dila_pissenlit(); } /* Start reinitialisation */ start_pissenlit(ip) { #include "externes()" inc=ip*Inc; /*Cpt_Reinit[ip]=Nb_Akene-1;*/ Cpt_Reinit[ip]=ent(.1*Nb_Akene)-1; if(Nb_Pissenlit<=1)return; w=[Akene,Akene+Nb_Akene-1],[Tige,Tige+Nb_Tige-1],Coeur; interaction valider(0)vol(w+inc); } set_pissenlit_1(ip) { #include "externes()" if((Flag_Effets[COU])<0)set_cou(0,ip);else set_cou(1,ip); if(Nb_Pissenlit<=1)return; inc=ip*Inc; w=[Akene,Akene+Nb_Akene-1],[Tige,Tige+Nb_Tige-1],Coeur; interaction valider(1)vol(w+inc); r=.25*R_Ciel;rz=.33*R_Ciel; /*Poi_Base{ip}=rand2f(-r,r),0,rand2f(-r,r);*/ Poi_Base{ip}=rand2f(-r,r),0,rand2f(-r,1.5*r); set_base(); n1=ip*Nb_Akene;akene=Akene+ip*Inc;t=1.15*Y_Tige; base=Base+inc;tige=Tige+inc; x=X_Base[2];y=Y_Base[2];z=Z_Base[2]; interaction plac vol(base)poi(t*(x,y,z)+(Poi_Base{ip})); f=(Akene+inc)+[0,Nb_Akene-1]; force rota vol(f)=0,0,0,Visc; vitesse rota vol(f)=0,0,0; interaction(3)traj rota(0,0)vol(f)abs; coeur=Coeur+inc; vitesse som(Som)vol(coeur)=0,0,0; force som(Som)vol(coeur)=0,0,0,Visc; valider(-1)poi vol(coeur); } set_base() { #include "externes()" for(i=0,Nb_Pissenlit-1){pi=Poi_Base{i};N_Base[i]=pi[2];} L=limite(Poi_Base);z1=L[2];z2=L[5];if((dz=z2-z1)<.1)dz=.1; for(i=0,Nb_Pissenlit-1){z=N_Base[i];N_Base[i]=1-.75*(z-z1)/dz;} } set_pissenlit() { #include "externes()" set_base(); n1=0;akene=Akene;t=1.15*Y_Tige; for(i=0,Nb_Pissenlit-1) { inc=i*Inc;base=Base+inc;tige=Tige+inc; x=X_Base[2];y=Y_Base[2];z=Z_Base[2]; interaction plac vol(base)poi(t*(x,y,z)+(Poi_Base{i})); for(j=0,Nb_Akene-1) interaction axe vol(akene+j)=Axe{j+n1}; n1+=Nb_Akene;akene+=Inc; interaction memoire(1)vol(Coeur+inc)=1; interaction memoire(2)vol(Coeur+inc)=1; } } dila_pissenlit() { #include "externes()" c=Taille[2]; for(ip=0,Nb_Pissenlit-1)interaction dila vol(Base+ip*Inc)coe(c,c,c); } F2() { #include "externes()" #define d0 .4 #define cpt0 50 static cpt=0 if(Sem_Rapide>0) { Sem_Rapide--; if(Sem_Rapide==0) {_d(-1);_s(-1);} } /* Capteur */ /* ------- */ lire_capteur(); k=D0*(Force[2]);n0=ent((Multi[2])*(D0-d0)/(1-d0));if(n0<0)n0=0;inc=0; Na=n0;s0=0;n1=0;n1=0;coeur=Coeur; for(ip=0,Nb_Pissenlit-1) { inc=ip*Inc;tige=(Tige+inc)+([0,Nb_Tige-1]); /* Fondu au blanc */ /* -------------- */ if((c=interaction memoire(1)vol(coeur))<1) { f=tige,(Akene+inc+[0,Nb_Akene-1]),Coeur+inc; c=c+1/Cpt_start0;if(c<0)c=0;if(c>1)c=1; col vol(f)=0,c,0,0,0,0,0; interaction memoire(1)vol(coeur)=c; if(ip==0)col vol(Akene1)=0,c,0,0,0,0,0; } /* Balancement */ /* ----------- */ if(Vit>0)vit=1;else vit=-1; r=(Balance[2])*rand2f(-1,1);ff=0,0,r*vit*D+rand2f(-.1,.1); interaction ajou force(ff)vol(tige); /* Reinitialisation */ /* ---------------- */ ss=Cpt_Reinit[ip]; if(ss>=0) { for(i=0,Np_Reinit) { f=Akene+inc+ss; force rota vol(f)=0,0,0,Visc; vitesse rota vol(f)=0,0,0; interaction(3)traj rota(0,0)vol(f)abs; vitesse som(Som[ss])vol(coeur)=0,0,0; force som(Som[ss])vol(coeur)=0,0,0,Visc; n=Np_Coeur+ss;valider(-1)poi(n)vol(coeur); ss--; interaction memoire(1)vol(coeur)=0; if(ss==0) { set_pissenlit_1(ip); Cpt_Reinit[ip]=-1; goto suite; } } Cpt_Reinit[ip]=ss-1; goto suite; } /* Arrachage des akenes */ /* -------------------- */ if(n0==0) /* Calme */ { if(ip==0) { cpt--; if(cpt<0) { coeur0=ip_0=NIL; for(ip0=0,Nb_Pissenlit-1) { ind=ip0*Nb_Akene;s=somme(Set_Akene[ind,ind+Nb_Akene-1]); if(s>0) {coeur0,=Coeur+ip0*Inc;ip_0,=ip0;} } if(coeur0!=NIL)goto arr; goto suite; arr: n=dim(coeur0);n=rand(n);coeur0=coeur0[n];ip0=ip_0[n]; interaction plac vol(Akene1)poi(interaction CG vol(coeur0)); x=rand2f(5,10);if(rand(2))x=-x;y=-rand2f(2.5,5);an=atan(x/y);u=x,y,0; interaction rotz vol(Akene1)ang(PI-an); interaction(25)traj rotz(0,PI)vol(Akene1)abs; vitesse vol(Akene1)=u; force vol(Akene1)=Pesanteur,-.1; cou vol(Akene1)=cou vol(Akene+ip0*Inc); cpt=cpt0; } } } else /* Souffle */ { n=n0*N_Base[ip]; while(n-->0) { i_permut=I_Permut[ip]; sp=Permut[i_permut];f=Akene+inc+sp; Set_Akene[ip*Nb_Akene+sp]=0; sf=som lead vol(f);s=sf-Np_Coeur-2; ff=k*(Norm{s}+(0,-.5,1))+.25*(vitesse vol(coeur)),-.1; vitesse som(sf)vol(coeur)=ff; force som(sf)vol(coeur)=Pesanteur,-1; interaction(30)traj rota(0,0,Ang[sf])vol(f)abs; i_permut++; if(i_permut>(Nb_Akene-1)) /* Start reinitialisation */ { I_Permut[ip]=0; goto suite; } else I_Permut[ip]=i_permut; } } suite: coeur+=Inc;inc+=Inc;n1+=N1;n1+=N1; } s=somme(Set_Akene); if(s==0) { /* Fondu au noir */ if(Cpt_start) { Cpt_start--; c=Cpt_start/Cpt_start0; for(ip=0,Nb_Pissenlit-1) { inc=ip*Inc;tige=(Tige+inc)+([0,Nb_Tige-1]); f=tige,(Akene+inc+[0,Nb_Akene-1]),Coeur+inc; col vol(f)=0,c,0,0,0,0,0; } col vol(Akene1)=0,c,0,0,0,0,0; } else { for(ip=0,Nb_Pissenlit-1) start_pissenlit(ip); Set_Akene=calloc(Nb_Pissenlit*Nb_Akene,1); Cpt_start=Cpt_start0; } } /* Effets */ /* ------ */ for(i=0,NB_EFFETS-1) {if(Flag_Effets[i]>0)exec_EFF(i);} if(Cpt_Brou0) { f=Num_Ciel[1];an=.25*Moy_Vit; interaction rotx vol(f)ang(an);interaction roty vol(f)ang(an);interaction rotz vol(f)ang(an); } /* Auto mapping */ /* ------------ */ if(Sem_Ciel && Sem_IMA==0) interaction generer image(1)poi(Xm,Ym); } lire_capteur() { #include "externes()" switch(Type_Capteur) { case AUD: a=audio;break; case SOU: a=souris normale;break; case DAT: a=((Coe_DAT[2])*(periph(1)inclu(I_DAT)champ(Champ_DAT[2])))+(Y_DAT[2]); I_DAT+=D_DAT[2];if(I_DAT<0)I_DAT=0;if(I_DAT>=NP_DAT)I_DAT=0; break; } a0=a[0];Vit=Valeur-a0; Moy_Vit=interaction moyenne nom("Moy_Vit")poi(Vit); Valeur=a0;D0=(Ka[2])*a0; /* Amplitude */ D0+=(Vent[2])*(abs(sin(An)));An+=DAn; D=interaction moyenne nom("D")poi(D0); Moy=interaction moyenne nom("Moy")poi(D0); D3=interaction moyenne nom("D3")poi(D0); } aff_capteur() { #include "externes()" x0=0;x1=X1+150;x2=X2-20;y1=Y1+40;dy0=15;dy=20;dy2=50;y2=y1+dy2; switch(Type_Capteur) { case AUD: interaction aff audio var poi(x1,y1,x2,y2)coe(-.25)rectangle; y1=y2+dy; Ka[2]=interaction echelle("Coef = ")coe(Ka)poi(x0,y1,x2,y1+dy0)aff;y1+=dy; interaction echelle("Moy = ")coe(0,1.5,Moy)poi(x0,y1,x2,y1+dy0)aff;y1+=dy; break; case SOU: interaction echelle("souris")coe(0,1.5,Valeur)poi(x0,y1,x2,y1+dy0)aff;y1+=dy; break; case DAT: ns=seg_dat();y=Y_DAT[2];dd=.5*y*dy2; interaction aff periph(1)poi(x1,y1-y-dd,x2,y2-y-dd)champ(Champ_DAT[2]) coe(Coe_AFF_DAT[2])motif(ns)rectangle cou(1,1,0, 0,0,.5); x=x1+I_DAT*(x2-x1)/(NP_DAT-1); interaction segment(x,y1,x,y2+5)cou(1,0,0); y1=y2; Coe_DAT[2]=interaction echelle("coe = ")coe(Coe_DAT)poi(x0,y1,x2,y1+dy0)aff;y1+=dy; I_DAT=interaction echelle("ima")coe(0,NP_DAT-1,I_DAT,0)poi(x1,y1,x2,y1+dy0)aff int;y1+=dy; D_DAT[2]=interaction echelle("d_ima")coe(D_DAT)poi(x1,y1,x2,y1+dy0)aff ent(1);y1+=dy; Y_DAT[2]=interaction echelle("y")coe(Y_DAT)poi(x0,y1,x2,y1+dy0)aff;y1+=dy; Coe_AFF_DAT[2]=interaction echelle("coe_aff")coe(Coe_AFF_DAT)poi(x0,y1,x2,y1+dy0)aff;y1+=dy; Champ_DAT[2]=interaction echelle("champ = ")coe(Champ_DAT)poi(x0,y1,x2,y1+dy0)aff ent(1);y1+=dy; break; } interaction echelle("Amp = ")coe(0,1.5,Valeur)poi(x0,y1,x2,y1+dy0)cou(1,1,1)aff;y1+=dy; t=interaction echelle("aud,sou,dat = ")coe(1,3,Type_Capteur)poi(x0,y1,x2,y1+dy0)aff ent;y1+=dy; if(t!=Type_Capteur){Type_Capteur=t;ini_capteur();} } seg_dat() { extern C_DAT,I_DAT,NP_DAT c_dat=C_DAT[2];dn=ent(.5*c_dat); if((n1=I_DAT-dn)<0) {n1=0;I_DAT=dn;} if((n2=n1+c_dat-1)>=NP_DAT) {n2=NP_DAT-1;n1=n2-c_dat+1;I_DAT=dn;} return(n1,n2); } F4() { #include "externes()" /* Ciel def */ /* -------- */ if(Flag_Effets[DEF]==1) { /* o=oeil;oeil(o);p=inv pers fen;*/ o=oeil;p=inv pers fen; f=Num_Ciel[0];poi(1)vol(f)=p{0};poi(2)vol(f)=p{1};poi(3)vol(f)=p{3};poi(4)vol(f)=p{2}; } } F5() { #include "externes()" if(Loop_Max) { Loop_Cpt++; if(Loop_Cpt>Loop_Max) { system("pissenlits_expo.js");exit; } } if(Film)_g(); x0=100;x1=0;dy=20;y0=y=Y1+dy; if(Sem_h>0) { det_dim();k=1,1,0;x0=X1+20; w=("HELP PISSENLIT\n\n"); w,="Parametres\n"; w,=" LIRE0: lit uti/param0 (parametres par defaut)\n"; w,=" LIRE: lit uti/param\n"; w,=" GARE: gare dans uti/param\n"; w,=" DOC: documentation html\n"; w,=" Delai: fondu au noir\n"; w,=" Xm,Ym = centre de la mappe\n"; w,=" roul: roulis\n"; w,=" x,y,z: position de la base\n"; w,=" taille: taille\n"; w,=" brou: 0 (OFF), 1 (init), 2 (aleatoire)\n"; w,=" R V B: couleur du brouillard\n"; w,=" Vent\n"; w,=" Transp: transparence\n"; w,=" Pesan: pesanteur\n"; w,=" Force: arrachement des akenes\n"; w,=" Multi: multiplicite\n"; w,=" Balance: balancement\n"; w,=" Interpol: duree changement de cycle\n"; w,=" periode des effets programmes\n"; w,=" Effet: numero effet programme\n"; w,=" ciel defaut, sphere\n"; w,=" Signal audio, Coef*audio, amplitude, moyenne\n\n"; w,="Raccourcis clavier:\n"; w,=" a automatique, b: brouillard\n"; w,=" c couleur, d: ciel defaut\n"; w,=" e effets, f: fond\n"; w,=" g gare image, h: help\n"; w,=" i initialisations, o: oeil\n"; w,=" p parametres\n"; w,=" q: quitter\n"; w,=" s ciel spherique\n"; w,=" v visualisation audio, souris, datas\n"; w,=" : cache la souris\n"; w,=" z init effets\n\n"; interaction texte(w)poi(x0,y)rectangle cou(Kt, Kf); y+=33*dy; w0=chaine(Nb_Pissenlit); if(Nb_Pissenlit<=1)w0,=" pissenlit\n";else w0,=" pissenlits\n"; w0,=chaine(Nb_Akene0,Nb_Akene)," akenes\n"; interaction texte(w0)poi(0,y)rectangle cou(Kt, Kf); if(X_Mappe) { w="mappe: dim=",chaine(X_Mappe,Y_Mappe); interaction texte(w)poi(x0,y)rectangle cou(Kt, Kf);y+=dy; } } if(Verbose>0) { /* n=6+NB_CIEL; c=25; det_dim();x2=X2-20;dx=10*c;x1=x2-dx;dy2=dy/4;y=y0; interaction texte(chaine(Na)," akenes arrachees")poi(x1,y);y+=dy; interaction texte(chaine(Nb_Pissenlit)," pissenlits")poi(x1,y);y+=dy; t=chaine(Nb_Akene)," akenes";interaction texte(t)poi(x1,y);y+=dy; y=aff_Ciel(x1,y,dy); */ aff_capteur(); } if(Sem_p>0) { det_dim();x1=-.25*X2;x2=X2-20;dy=20;x12=.5*(x1+x2);dy2=.5*dy;dy3=.25*dy;y=y0; y=aff_Effets(x1,y+dy); interaction echelle fonc("LIRE0")poi(x1,y); interaction echelle fonc("LIRE")poi(x1+70,y); interaction echelle fonc("GARE")poi(x1+140,y); interaction echelle fonc("DOC")poi(x1+210,y); y+=dy; /*??? BUG p=interaction echelle("pissenlits")coe(1,20,Nb_Pissenlit,12)poi(x1,y,x2,y+dy2)aff ent;y+=dy; a=interaction echelle("akenes")coe(4,30,Nb_Akene0,15)poi(x1,y,x2,y+dy2)aff ent;y+=dy; if(p!=Nb_Pissenlit || a!=Nb_Akene0) { Nb_Pissenlit=p;Nb_Akene0=a;gen(); } ???*/ f=interaction echelle("Delai")coe(Delai)poi(x1,y,x2,y+dy2)aff int;y+=dy; if(f!=(Delai[2])) {Delai[2]=f;Cpt_start0=f;} if(X_Mappe) { xm=interaction echelle("Xm")coe(-X_Mappe,X_Mappe,Xm)poi(x1,y,x1+200,y+dy2)aff; if(xm!=Xm) {Xm=xm;Sem_Ciel=1;} ym=interaction echelle("Ym")coe(-Y_Mappe,Y_Mappe,Ym)poi(x1+300,y,x1+500,y+dy2)aff; if(ym!=Ym) {Ym=ym;Sem_Ciel=1;} y+=dy; } c=interaction echelle("roul")coe(Roul)poi(x1,y,x2,y+dy2)aff;y+=dy; if(c!=(Roul[2])) {Roul[2]=c;roul(c);set_roul();} xx=interaction echelle("x")coe(X_Base)poi(x1,y,x2,y+dy2)aff;y+=dy; yy=interaction echelle("y")coe(Y_Base)poi(x1,y,x2,y+dy2)aff;y+=dy; zz=interaction echelle("z")coe(Z_Base)poi(x1,y,x2,y+dy2)aff;y+=dy; if(xx!=(X_Base[2]) || yy!=(Y_Base[2]) || zz!=(Z_Base[2])) {X_Base[2]=xx;Y_Base[2]=yy;Z_Base[2]=zz;set_pissenlit();} c=interaction echelle("taille")coe(Taille)poi(x1,y,x2,y+dy2)aff;y+=dy; if(c!=(Taille[2])) {Taille[2]=c;dila_pissenlit();} t=interaction echelle("brou")coe(0,2,Type_Brou,0)poi(x1,y,x2,y+dy2)aff ent;y+=dy; if(t!=Type_Brou) {Type_Brou=t;set_brou();} R_Brou[2]=interaction echelle("R")coe(R_Brou)poi(x1,y,x2,y+dy2)aff;y+=dy; V_Brou[2]=interaction echelle("V")coe(V_Brou)poi(x1,y,x2,y+dy2)aff;y+=dy; B_Brou[2]=interaction echelle("B")coe(B_Brou)poi(x1,y,x2,y+dy2)aff;y+=dy; Vent[2]=interaction echelle("Vent")coe(Vent)poi(x1,y,x2,y+dy2)aff;y+=dy; t=interaction echelle("Transp")coe(Transp)poi(x1,y,x2,y+dy2)aff;y+=dy; if(t!=(Transp[2])) {Transp[2]=t;set_transp();} p=interaction echelle("Pesant")coe(Y_Pes)poi(x1,y,x2,y+dy2)aff;y+=dy; if(p!=(Y_Pes[2])) {Y_Pes[2]=p;Pesanteur=0,p,0;} Force[2]=interaction echelle("Force")coe(Force)poi(x1,y,x2,y+dy2)aff;y+=dy; Multi[2]=interaction echelle("Multi")coe(Multi)poi(x1,y,x2,y+dy2)aff;y+=dy; Balance[2]=interaction echelle("Balance")coe(Balance)poi(x1,y,x2,y+dy2)aff;y+=dy; Max_Interpol[2]=ent(interaction echelle("Interpol")coe(Max_Interpol)poi(x1,y,x2,y+dy2)aff); x=x2*Cpt_Interpol/(Max_Interpol[2]); interaction rectangle(0,y,x,y+dy3)cou(0,1,0); y+=dy; if(Flag_Effets[EFF]>0) { Periode_Effets[2]=interaction echelle("Periode = ")coe(Periode_Effets)poi(x1,y,x2,y+dy2)aff int; y+=dy; } n=interaction echelle("Effet = ")coe(0,Nb_Effets_Prog-1,Num_Effets_Prog)poi(x1,y,x2,y+dy2)aff ent; if(n!=Num_Effets_Prog && n!=EFF) {_z();Num_Effets_Prog=n;Cpt_Effets_Prog=Periode_Effets[2];exec_EFF(n);} y+=dy;d=50;y2=y+d;dx=(x2-x1)/4;x3=x1+dx;x4=x3+dx;x5=x4+dx; D_Cadre=interaction echelle("cadre ")poi(x1,y,x3-20,y+dy2)coe(0,50,D_Cadre)aff;Sem_Cadre=D_Cadre; Rc=interaction echelle("r")poi(x3+20,y,x4-20,y+dy2)coe(0,1,Rc); Vc=interaction echelle("v")poi(x4+20,y,x5-20,y+dy2)coe(0,1,Vc); Bc=interaction echelle("b")poi(x5+20,y,x2,y+dy2)coe(0,1,Bc); } if(X1==0)det_dim(); if(Sem_Cadre) { interaction rectangle(X1,Y1,X1+D_Cadre,Y2)cou(Rc,Vc,Bc); interaction rectangle(X2-D_Cadre,Y1,X2,Y2)cou(Rc,Vc,Bc); interaction rectangle(X1,Y1,X2,Y1+D_Cadre)cou(Rc,Vc,Bc); interaction rectangle(X1,Y2-D_Cadre,X2,Y2)cou(Rc,Vc,Bc); } } set_transp() { #include "externes()" Col[4]=Transp[2]; for(i=0,NB_CIEL-1) { f=Num_Ciel[i]; col vol(f)=Col; } } set_roul() { extern Roul,Num_Ciel interaction rotz vol(Num_Ciel)ang(-.5*(Roul[2]));roul(Roul[2]); } LIRE0() { w=clean(lire("param0"));exec(w); set_pissenlit();set_roul();dila_pissenlit(); } LIRE() { w=clean(lire("param"));exec(w); set_pissenlit();set_roul();dila_pissenlit(); } GARE() { #include "externes()" w="/* param: Fichier des parametres*/\n\n"; w,="Nb_Pissenlit = ",chaine(Nb_Pissenlit),";\n"; w,="Nb_Akene0 = ",chaine(Nb_Akene0 ),";\n"; w,="Flag_Effets = ",chainef(Flag_Effets),";\n"; w,="Delai[2] = ",chainef(Delai[2]),";\n"; w,="Xm = ",chainef(Xm),";\n"; w,="Ym = ",chainef(Ym),";\n"; w,="Roul[2] = ",chainef(Roul[2]),";\n"; w,="X_Base[2] = ",chainef(X_Base[2]),";\n"; w,="Y_Base[2] = ",chainef(Y_Base[2]),";\n"; w,="Z_Base[2] = ",chainef(Z_Base[2]),";\n"; w,="Taille = ",chainef(Taille),";\n"; w,="Type_Brou = ",chainef(Type_Brou),";\n"; w,="R_Brou[2] = ",chainef(R_Brou[2]),";\n"; w,="V_Brou[2] = ",chainef(V_Brou[2]),";\n"; w,="B_Brou[2] = ",chainef(B_Brou[2]),";\n"; w,="Vent[2] = ",chainef(Vent[2]),";\n"; w,="Transp[2] = ",chainef(Transp[2]),";\n"; w,="Delai[2] = ",chainef(Delai[2]),";\n"; w,="Y_Pes[2] = ",chainef(Y_Pes[2]),";\n"; w,="Force[2] = ",chainef(Force[2]),";\n"; w,="Multi[2] = ",chainef(Multi[2]),";\n"; w,="Balance[2] = ",chainef(Balance[2]),";\n"; w,="Max_Interpol[2] = ",chainef(Max_Interpol[2]),";\n"; w,="Periode_Effets[2] = ",chainef(Periode_Effets[2]),";\n"; w,="Num_Effets_Prog = ",chainef(Num_Effets_Prog),";\n"; w,="Rc = ",chainef(Rc),";"; w,="Vc = ",chainef(Vc),";"; w,="Bc = ",chainef(Bc),";"; w,="D_Cadre = ",chainef(D_Cadre),";\n"; w,="Ka[2] = ",chainef(Ka[2]),";\n"; w,="Flag_Effets = ",chainef(Flag_Effets),";\n"; w,="\n/* END */\n"; $"w = ",w;RC; oui gare;gare(w)nom("param"); } DOC() { system("pissenlits_expo.htm"); } /* Initialisations */ /* --------------- */ INIT() { #include "externes()" w=numero vol;interaction valider(-1)vol(w); for(i=0,Nb_Pissenlit-1) { inc=i*Inc; base=Base+inc;tige=Num_Tige+inc; coeur=Coeur+inc; akene=Num_Akene+inc; interaction valider(0)vol(base,tige); interaction valider(1)vol(tige,coeur,akene); } interaction valider(1)vol(Akene1); Cpt=Cpt0; _i(0); Sem_h=Sem_p=-1;Sem_s=1; X1=0; Set_Akene=calloc(Nb_Pissenlit*Nb_Akene,1); Cpt_start0=Cpt_start=Delai[2]; } /* EFFETS */ /* ====== */ exec_EFF(n) { #include "externes()" switch(n) { case AUT: /* automatique */ exec_AUT(1);break; case BRO: /* brouillard */ if(Type_Brou) interaction brou((R_Brou[2])*Moy,(V_Brou[2])*Moy,(B_Brou[2])*Moy)zbuf(Z1_Brou,Z2_Brou); break; case COU: /* couleur */ break; case DEF: /* ciel par defaut */ break; case EFF: /* Effets programmes */ Cpt_Effets_Prog++;if(Cpt_Effets_Prog>=(Periode_Effets[2])) { Cpt_Effets_Prog=0; _z(1); switch(Num_Effets_Prog) { case 0: _b(1);_s(1);break; /* brou + sph */ case 1: _c(1);break; /* cou */ case 2: _d(1);break; /* ciel def */ case 3: _f(1);break; /* fond */ case 4: _o(1);break; /* oeil */ case 5: _s(1);break; /* ciel sphere */ } Num_Effets_Prog++;if(Num_Effets_Prog>=Nb_Effets_Prog)Num_Effets_Prog=0; } break; case FON: /* fond */ if((n=Nb_Fond*D)>=Nb_Fond)n=Nb_Fond-1; fond(Tab_Fond{n}); break; case GAR: /* gare */ break; case HEL: /* help */ break; case INI: /* init */ break; case JJJ: /* Libre */ break; case KKK: /* Libre */ break; case LLL: /* Libre */ break; case MMM: /* Libre */ break; case NNN: /* Libre */ break; case OEI: /* oeil */ if(Nb_Oeil==0)_o(1); cpt=int(Cpt_Oeil);c=Cpt_Oeil-cpt; if(cpt>=Nb_Oeil){cpt=Cpt_Oeil=0;} o1=Tab_Oeil{Cpt_Oeil};o2=Tab_Oeil{cpt};o=o1+c*(o2-o1); oeil((R_Ciel*Oeil0)+o); Cpt_Oeil+=Moy; break; case PAR: /* parametres */ break case QUI: /* quitter */ exit; case RRR: /* Libre */ break; case SPH: /* sphere */ _s(1);break; case TTT: /* Libre */ break; case UUU: /* Libre */ break; case VER: /* verbose */ break; case WWW: /* Libre */ break; case XXX: /* Libre */ break; case YYY: /* Libre */ break; case ZER: /* zer effets */ _z();break; } } aff_Ciel(x,y,dy) { #include "externes()" interaction rectangle(x-10,y-30,x+260,y+dy*NB_CIEL)cou(Kf); nn=" ciel ",(Nom_Ciel{0}); if(Flag_Effets[DEF]>0) {t=": oui";c=0,1,0, 0,0,.5;} else {t=": non";c=1,0,0, 0,0,.5;} interaction texte(nn)poi(x,y)cou(c);y+=dy; nn=" ciel ",(Nom_Ciel{1}); if(Flag_Effets[SPH]>0) {t=": oui";c=0,1,0, 0,0,.5;} else {t=": non";c=1,0,0, 0,0,.5;} interaction texte(nn)poi(x,y)cou(c);y+=dy; return(y); } aff_Effets(x0,y0) { #include "externes()" if(Cpt_p) {interaction valider(1)menu;Cpt_p=0;} dy=20; interaction texte("Effets")poi(x0,y0)cou(1,1,0, 0,0,.5); x=x0;dx=60;y0+=dy;y=y0; for(i=0,6) { if(Sem_Effets[i]) { nn=Nom_Effets{i};c=nn[0]; if(Flag_Effets[i]>0)k=0,1,0, 0,0,.5;else k=1,0,0, 0,0,.5; interaction echelle(nn)fonc(Fonc_Effets{i})poi(x,y)cou(k); } y+=dy; } y=y0;x+=dx; for(i=7,13) { if(Sem_Effets[i]) { nn=Nom_Effets{i};c=nn[0]; if(Flag_Effets[i]>0)k=0,1,0, 0,0,.5;else k=1,0,0, 0,0,.5; interaction echelle(nn)fonc(Fonc_Effets{i})poi(x,y)cou(k); } y+=dy; } y=y0;x+=dx; for(i=14,20) { if(Sem_Effets[i]) { nn=Nom_Effets{i};c=nn[0]; if(Flag_Effets[i]>0)k=0,1,0, 0,0,.5;else k=1,0,0, 0,0,.5; interaction echelle(nn)fonc(Fonc_Effets{i})poi(x,y)cou(k); } y+=dy; } y=y0;x+=dx; for(i=21,25) { if(Sem_Effets[i]) { nn=Nom_Effets{i};c=nn[0]; if(Flag_Effets[i]>0)k=0,1,0, 0,0,.5;else k=1,0,0, 0,0,.5; interaction echelle(nn)fonc(Fonc_Effets{i})poi(x,y)cou(k); } y+=dy; } return(y+2*dy); } det_Sem_Ciel() { extern Sem_Ciel,Flag_Effets Sem_Ciel=0; if(Flag_Effets[DEF]>0)Sem_Ciel++; if(Flag_Effets[SPH]>0)Sem_Ciel++; } /* _x */ /* -- */ _a(v) { extern Flag_Effets if(v!=NIL)Flag_Effets[AUT]=-v; Flag_Effets[AUT]=-Flag_Effets[AUT]; } _b(v) { extern Flag_Effets,R_Ciel,Moy if(v!=NIL)Flag_Effets[BRO]=-v; Flag_Effets[BRO]=-Flag_Effets[BRO]; if(Flag_Effets[BRO]>0) /*interaction brou(0,0,Moy)zbuf(0,10*R_Ciel);*/ interaction oui brou; else interaction non brou; } _c(v) { extern Flag_Effets if(v!=NIL)Flag_Effets[COU]=-v; Flag_Effets[COU]=-Flag_Effets[COU]; if((Flag_Effets[COU])<0)set_cou(0);else set_cou(1); } _d(v) { extern Flag_Effets,Num_Ciel if(v!=NIL)Flag_Effets[DEF]=-v; s=Flag_Effets[DEF];Flag_Effets[DEF]=-s; f=Num_Ciel[0]; interaction valider(-s)vol(f); det_Sem_Ciel(); } _e() { extern Flag_Effets Flag_Effets[EFF]=-Flag_Effets[EFF]; } _f(v) { extern Flag_Effets,Fond0 if(v!=NIL)Flag_Effets[FON]=-v; Flag_Effets[FON]=-Flag_Effets[FON]; if(Flag_Effets[FON]<0)fond(Fond0); } _g() { extern Nom_Image,I_Image nn=Nom_Image,chaine("4D",I_Image),".bmp"; system("del ",nn); gare image nom(nn);I_Image++; } _h(v) { extern Flag_Effets,Sem_h if(v!=NIL)Flag_Effets[HEL]=-v; Flag_Effets[HEL]=-Flag_Effets[HEL]; Sem_h=Flag_Effets[HEL]; } /* Reinitialisations i */ /* ------------------- */ _i(sem) { #include "externes()" Force[2]=Force[3]; Multi[2]=Multi[3]; Balance[2]=Balance[3]; Y_Pes[2]=Y_Pes[3];Pesanteur=0,(Y_Pes[2]),0; Ka[2]=Ka[3]; X_Base[2]=X_Base[3];Y_Base[2]=Y_Base[3];Z_Base[2]=Z_Base[3]; Taille[2]=Taille[3]; Transp[2]=Transp[3]; /* Transparence */ Cpt_start0=Delai[2]=Delai[3]; /* Delai */ Periode_Effets[2]=Periode_Effets[3]; Vent[2]=Vent[3]; Cpt=Cpt0=50; /* Avant reinitialisation */ Max_Interpol[2]=Max_Interpol[3]; Verbose=-1; oui col mappe dynamique anc; /* Brouillard */ /* ---------- */ Z1_Brou=0;Z20_Brou=Z2_Brou=4*R_Ciel;Cpt_Brou=Cpt0; R_Brou[2]=R_Brou[3]; V_Brou[2]=V_Brou[3]; B_Brou[2]=B_Brou[3]; /* Fond */ /* ---- */ Sem_Fond=-1;Fond=Fond0; Nb_Fond=100; set_fond(); init_oeil(); /* Transparence */ /* ------------ */ set_transp(); Xm=Ym=0; if(sem==NIL) {set_pissenlit();dila_pissenlit();} } _j() { } _k() { } _l() { } _m() { } _n() { } _o(v) { extern Flag_Effets,Nb_Oeil,Cpt_Oeil,Tab_Oeil,R_Ciel if(v!=NIL)Flag_Effets[OEI]=-v; Flag_Effets[OEI]=-Flag_Effets[OEI]; if((Flag_Effets[OEI])>0) { Nb_Oeil=200;Cpt_Oeil=0; n=5;Tab_Oeil=calloc(3*n); x=R_Ciel*(-.2,.2);y=R_Ciel*(-.1,.1);z=R_Ciel*(0,.2); for(i=1,n-1)Tab_Oeil{i}=rand2f(x),rand2f(y),rand2f(z); Tab_Oeil=ajust(Nb_Oeil)ligne(Tab_Oeil,0,0,0)ext(Nb_Oeil/n,1,1); } else init_oeil(); } _p() { extern Sem_p,Sem_Ciel,Flag_Effets,Cpt_p Flag_Effets[PAR]=-Flag_Effets[PAR]; Sem_p=Flag_Effets[PAR]; if(Sem_p>0) { interaction valider(1)menu;Sem_Ciel=0; Cpt_p=1; } else { interaction valider(0)menu;det_Sem_Ciel(); Cpt_p=0; } } _q() { exit; } _r() { } _s(v) { extern Flag_Effets,Num_Ciel if(v!=NIL)Flag_Effets[SPH]=-v; s=Flag_Effets[SPH];Flag_Effets[SPH]=-s; f=Num_Ciel[1]; interaction valider(-s)vol(f); det_Sem_Ciel(); } _deux_points() { extern Deux_Points Deux_Points=-Deux_Points; if(Deux_Points<0) interaction valider(0)menu; else interaction valider(1)menu; } _t() { } _u() { } _v() { extern Verbose,Flag_Effets Flag_Effets[VER]=-Flag_Effets[VER]; Verbose=Flag_Effets[VER]; if(Verbose>0) interaction valider(1)menu; else interaction valider(0)menu; } _w() { } _x() { } _y() { } _z(sem) { extern Flag_Effets Flag_Effets=calloc(NB_EFFETS,-1); if(sem!=NIL)Flag_Effets[EFF]=1; } /* Effets programmes */ /* ----------------- */ init_Effets_Progr() { extern Nb_Effets_Prog,Cpt_Effets_Prog,Periode_Effets,Num_Effets_Prog Nb_Effets_Prog=6; Num_Effets_Prog=Cpt_Effets_Prog=0; } /* AUT */ /* === */ exec_AUT() { #include "externes()" /* Interpoler */ m=Max_Interpol[2]; if(Cpt_Interpol=(NB_CIEL-1))I_Ciel=0; valider_Ciel(1,I_Ciel); Cpt_Cycle=Cpt_Interpol=0; set_pissenlit(); } } valider_Ciel(sem,ind) { #include "externes()" f=Num_Ciel[ind]; interaction valider(sem)vol(f); } /* UTILITAIRES */ /* =========== */ set_brou() { extern Type_Brou,R_Brou,V_Brou,B_Brou=0,1,.5,.5; switch(Type_Brou) { case 1: /* Defaut */ R_Brou=0,1,.25,.25; V_Brou=0,1,1,1; B_Brou=0,1,.5,.5; break; case 2: /* Alea */ c=rand2f(0,1);R_Brou=0,1,c,c; c=rand2f(0,1);V_Brou=0,1,c,c; c=rand2f(0,1);B_Brou=0,1,c,c; break; } } /* w="option=val */ lire_val(w) { n=dim(w);for(i=0,n-1) { if((w[i])=="=")return(atof(w[i+1,n-1])); } return(NIL); } /* w="option="nom" */ lire_nom(w) { n=dim(w);for(i=0,n-1) { if((w[i])=="=")return(w[i+1,n-1]); } return(NIL); } erreur_option(w) { $w,": ERREUR OPTION\7\n";return(-1); } det_dim() { extern X1,Y1,X2,Y2 d=dim ecr;X2=.5*(d[0]);Y2=.5*(d[1]);X1=-X2;Y1=-Y2; } cg_secy(f,y) { g0=CG secy(1)vol(f); ny=secy vol(f);g1=CG secy(ny+1)vol(f); return((1-y)*g0+y*g1); } set_nom(f,nn) { nom vol(f)=nn; } Verbose0(nn,p) { extern Verbose if(Verbose>0){$nn;$chaine(p);RC;} } set_fond() { #include "externes()" r=0,1; f=0,0,0, rand2f(r),rand2f(r),0, 0,rand2f(r),rand2f(r), rand2f(r),0,rand2f(r), rand2f(r),rand2f(r),rand2f(r); Tab_Fond=ajust(Nb_Fond)ligne(f)ext(3,1,1); Fond=Fond0;fond(Fond); } init_oeil() { extern R_Ciel,Oeil0,Roul /*ini vue;*/ oeil(R_Ciel*Oeil0);fui(0,0,0);foc(1); roul(Roul[2]); } permutation(n,inc) { p=calloc(n); for(i=0,n-1) { deb: n1=rand(n)+inc; for(j=0,i-1){if((p[j])==n1)goto deb;} p[i]=n1; } return(p); } /* BUG */ /* === */ z() { w="pis=1"; set(w); gen_base();gen_tige();gen_Coeur();gen_akene(); anc_pissenlit(); oui anc; interaction fonc(0,"Z0"); } /* END */