%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % MetaPost program by Anthony Phan. % file: brownians-disc.mp % last modification: May 31, 2005. (unstable) % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Licence? NONE % % Anthony Phan, % % D\'epartement de Math\'ematiques, % SP2MI, T\'el\'eport 2, % Boulevard Marie et Pierre Curie, % BP 30179, % F-86962 Futuroscope-Chasseneuil cedex. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % PARAMETERS % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% defaultfont:="ptmr8r"; randomseed:=0; %prologues:=2; nfig:=10; ds := 0.05; smax := 200; nB:=2; pair B[]; color C[]; u=4cm; nborder:=40; C1=red; C2=blue; picture lastpicture; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % USEFUL THINGS % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def gdraw expr p = draw p scaled u enddef; vardef catpict(text t) = save catpict_; picture catpict_; catpict_ = nullpicture; for $ = t: if known $: addto catpict_ also ( if picture $: $ elseif string $: ($ infont defaultfont scaled defaultscale) elseif numeric $: (gdecimal($)) fi shifted (xpart(urcorner catpict_-llcorner catpict_), 0)); fi endfor catpict_ enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % DISC GEOMETRY % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% vardef determinant(expr z_, z__) = xpart z_*ypart z__-xpart z__*ypart z_ enddef; vardef Dcenter(expr z_, z__) = save det, ssq_, ssq__; det = xpart z_*ypart z__-xpart z__*ypart z_; ssq_ = xpart z_*xpart z_+ypart z_*ypart z_+1; ssq__ = xpart z__*xpart z__+ypart z__*ypart z__+1; if abs det < eps: % message "Dcenter at infinity"; Infinity % quite arbitrary else: (ypart z__*ssq_-ypart z_*ssq__, xpart z_*ssq__-xpart z__*ssq_)/2det fi enddef; pair lastcenter, Infinity; Infinity=(infinity, infinity); def Dgeodesic(expr z_, z__, markcenter) = lastcenter := Dcenter(z_,z__); if lastcenter = Infinity: gdraw z_--z__ else: if markcenter: gdraw lastcenter..z_ withpen pencircle scaled 0.2pt dashed evenly; gdraw lastcenter..z__ withpen pencircle scaled 0.2pr dashed evenly; gdot lastcenter; % drawarrow gcoord(z_)..gcoord(z_+Ddir(z_,z__)); % drawarrow gcoord(z__)..gcoord(z__+Ddir(z__,z_)); fi if determinant(z_-lastcenter, z__-lastcenter) < 0: gdraw z_{(z_-lastcenter) rotated -90} ...z__{(z__-lastcenter) rotated -90} else: gdraw z_{(z_-lastcenter) rotated 90} ...z__{(z__-lastcenter) rotated 90} fi fi enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % BROWNIANS % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% vardef nextB@# = B@#:=B@#+ds*(1-(abs B@#)**2)*dir(uniformdeviate 360)/2; B@# enddef; for i = 1 upto nB: B[i] := origin;%uniformdeviate(1-2ds)*dir uniformdeviate 360; endfor %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % FIGURES % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %input animate; beginfig(0); pickup pencircle scaled 0.4pt; for i = 0 upto nborder: fill fullcircle scaled (i/nborder)[3u,2u] withcolor ((i/nborder)**2)[white, 0.25white]; endfor fill fullcircle scaled 2u withcolor white; draw fullcircle scaled 2u; % label.ulft("Browniens hyperboliques par Anthony Phan", 1.5u*(1,-1)); lastpicture:=currentpicture; for i=1 upto nB: dotlabel("", B[i] scaled u);endfor endfig; for $ = 1 upto nfig: beginfig($); addto currentpicture also lastpicture; s := 0; forever: for i = 1 upto nB: draw (B[i]..nextB[i]) scaled u withcolor ($/nfig)[0.3[white,C[i]], C[i]]; endfor s:=s+ds; exitif (s >= smax/nfig);% for i = 1 upto nB: or (abs B[i] > 1-ds) endfor; endfor lastpicture:=currentpicture; % Dgeodesic(B1,B2,false); label.lrt(catpict(btex $t = {}$ etex, decimal(round(smax*$/nfig*ds*ds*1000)/1000)), 1.5u*(-1,1)); for i=1 upto nB: dotlabel("", B[i] scaled u);endfor endfig; endfor %Animate(0,false); end.