Rev 18513 | Rev 18529 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
!if $wims_read_parm!=slib_header
!goto proc
!endif
slib_title=Pavage hyperbolique du disque de Poincaré
slib_author=Bernadette, Perrin-Riou
slib_parms=3\
,vecteur représentant les paramètres de la tuile\
0.01,eps\
size=600 color=[black,white] depl=0 type=, option (mots) : size= color=[] html/url fill depl= type= alt
slib_out=dessin d'un pavage hyperbolique ou code ou url selon les cas \
associé à un polygone tangentiel ou de type regular.
slib_comment=La forme de la tuile est spécifiée de la manière suivante \
(les d_i sont des entiers supérieurs à 3): les angles du polygone sont la suite des \
2*pi/d_1, ..., 2*pi/d_n et le polygone est un polygone tangentiel, c'est-à-dire un\
polygone convexe admettant un cercle inscrit.\
Ce pavage existe si les d_i sont pairs et pas toujours si ce n'est pas le cas ...\
Si le type est <span class=tt">"regular"</span>, deux paramètres suffisent,\
le polygone est un polygone à d_1 côtés égaux et d_1 angles égaux à 2*pi/d_2.\
Le pavage (qui est théoriquement infini) est limité au cercle de rayon 1-eps (eps>0.04).\
Cependant, le nombre de polygones dessinés est limité à 500.\
Si eps est un entier, seules les esp premières tuiles sont dessinées.
!!!<br>On peut appliquer la transformation de Moebius z->(a*z+b)/(\bar{b}z+\bar{a})\
!!!codé par [a,b,0] ou z->(a*\bar{z}+b)/(\bar{b}\bar{z}+\bar{a}) codé par [a,b,1]\
!!!avec |a|>|b|; elle envoie 0 sur b/\bar{a} et le point 1 de l'horizon sur\
!!!a/\bar{a}.
slib_example=[8,8,4,8],0.01,html color=blue\
[4,8,10],0.01,html\
[4,8,6,4,6,6],0.01,html\
[8,8,4,8],0.01,html color=blue\
[34,5,34],0.1,html fill=[1]\
[6,8,10],0.1,html color=[blue,grey] fill\
[6,8,10],0.1,color=blue html depl=0.5+I*0.5\
[6,8,10],6,html color=blue\
[5,8,3,8],0.04,color=black html\
[5,8,3,8],0.04,color=black html depl=-0.5+I*0.5\
[6,8,10],0.1,html fill=[1,5,7]\
[34,5,34],0.1,html fill=[1]\
[5,8],0.01,html color=black type=regular\
[4,8],0.01,html color=black type=regular\
[6,8,10],0.1,html fill=[1,5,7]\
[4,8,9,8,6],0.01,html
!exit
:proc
!reset slib_Test slib_type slib_bound slib_size slib_color slib_dessin slib_dessin1 slib_dessin2 slib_dessin3 slib_depl slib_fill
!distribute items $wims_read_parm into slib_data,slib_bound,slib_option
!set slib_gpprog=hyptiling
!if $slib_bound<0.01
!!reset slib_bound
!endif
!set wims_multiexec=$wims_multiexec pari
!default slib_bound=0.01
!set slib_size=!getopt size in $slib_option
!default slib_size=600
!set slib_color=!getopt color in $slib_option
!set slib_color=!declosing $slib_color
!if fill iswordof $slib_option
!set slib_pol=fhyppolygon
!default slib_color=black,white
!else
!set slib_pol=hyppolygon
!default slib_color=black,black
!endif
!set slib_color=$slib_color,$(slib_color[1])
!set slib_color=$(slib_color[1,2])
!set slib_fill=!getopt fill in $slib_option
!set slib_fill=!declosing $slib_fill
!set slib_type=!getopt type in $slib_option
!set slib_depl=!getopt depl in $slib_option
!default slib_depl=0
!set slib_pqr=!declosing $slib_data
!set slib_pqr=!exec pari [$slib_pqr]
!if $slib_type=
!set slib_n=!itemcnt $slib_pqr
!set slib_testexist=!exec pari a=[$slib_pqr];test=vecsum(vector($slib_n,i,1/a[i]))>=($slib_n-2)/2;a=concat(a,a[1]);for(i=2,$slib_n,if(a[i]%2==1, test+=a[i-1]!=a[i+1])); test
!if $slib_testexist>0
!set slib_out=error $slib_testexist>0
!exit
!endif
!endif
!if $slib_type issametext regular
!if $[1/$(slib_pqr[1])+1/$(slib_pqr[2])]>=1/2
slib_out=Error $slib_type
!exit
!endif
!set slib_pqr=!makelist $(slib_pqr[2]) for x=1 to $(slib_pqr[1])
!endif
!set slib_testint=!exec pari t=[$slib_pqr]; t-round(t)==0
!if $slib_testint!=1
slib_out=Error integers
!exit
!endif
!if $(slib_header_$slib_gpprog)=
!readproc gp/$slib_gpprog.gp
!set slib_hyptiling=!exec pari tikz=0;$(slib_header_$slib_gpprog);
!endif
!set slib_hyptiling=!exec pari wwww=catalan([$slib_pqr],$slib_bound,$slib_depl)[1];default(realprecision,3);wims_export(wwww)
!set slib_data=!trim $slib_hyptiling
!! depends only on $slib_data -- could be an "offhypdraw"
!set slib_data=!declosing $slib_data
!distribute items $slib_data into slib_som, slib_face
slib_som=!declosing $slib_som
slib_face=!declosing $slib_face
slib_facecnt=!rowcnt $slib_face
!for slib_k=1 to $slib_facecnt
!reset slib_tmp slib_test slib_col
!set slib_ff=$(slib_face[$slib_k;])
!set slib_col=$(slib_color[1+$(slib_ff[$[$(slib_ff[1])+2]])])
!if $slib_k isin $slib_fill
!set slib_pol1=fhyppolygon
!else
!set slib_pol1=$slib_pol
!endif
!set slib_tmp=!replace internal ; by , in $slib_pol1 $(slib_col),$(slib_som[$(slib_ff[2..$(slib_ff[1])+1]);])
!set slib_col=black
!if $slib_k<500
!set slib_dessin=!append line $slib_tmp to $slib_dessin
!else
!goto out
!if $slib_k<800
!set slib_dessin1=!append line $slib_tmp to $slib_dessin1
!else
!if $slib_k<2400
!set slib_dessin2=!append line $slib_tmp to $slib_dessin2
!else
!set slib_dessin3=!append line $slib_tmp to $slib_dessin3
!endif
!endif
!endif
:end
!next
:out
!set slib_range=-1,1
!set slib_out=xrange $slib_range\
yrange $slib_range\
circles black,0,0,1\
$slib_dessin
$slib_dessin1
$slib_dessin2\
$slib_dessin3
!if url iswordof $slib_option or html iswordof $slib_option
!set insdraw_size=$slib_size,$slib_size
!insdraw $slib_out
!set slib_out=$ins_url
!if html iswordof $slib_option
!if alt iswordof $slib_option
!set slib_alt=[$slib_pqr]
!else
!reset slib_alt
!endif
!set slib_out=<img src="$ins_url" alt="$slib_alt">
!else
!set slib_out=$slib_out,$insdraw_size
!endif
!endif