!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 reprsentant les paramtres de la tuile)\
0.01,eps\
size=600 color=[black,white] depl=[1,0,0] type=triangle, 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 de type triangle, kite, parallelogram ou regular.

slib_comment=La forme de la tuile est spcifie par le type (les d_i sont suprieurs  3):\
  <ul><li><span class="tt">triangle</span>: les angles du triangle de base sont 2*pi/d_1, 2*pi/d_2, 2*pi/d_3\
    avec 1/d_1+1/d_2+1/d_3<1/2, si l'un est impair, les deux autres sont gaux;</li>\
  <li><span class="tt">kite</span> (cerf-volant): les angles sont 2Pi/d_1, 2Pi/d_2, 2Pi/d_3, 2Pi/d_2 \
    avec 1/d_1+2/d_2+1/d_3<1, si d_2 est impair, d_1=d_3</li>\
  <li><span class="tt">parallelogram</span>: 1/d_1+1/d_2<1/2,\
    deux angles 2*pi/d_1 et 2*pi/d_2, dpend d'un paramtre mu strictement plus petit que  1,\
    si d_1 ou d_2 est impair, on doit prendre mu=1/2. </li>\
  <li><span class="tt">regular</span>: avec 1/d_1+1/d_2<1/2, polygone  d_1 cts gaux,\
    et d_1 angles gaux  2*pi/d_2.</li>\
  </ul>\
  Le pavage (qui est thoriquement infini) est limit au cercle de rayon 1-eps (eps>0.04).\
  Cependant, le nombre de polygones dessins est limit  500.\
  Si eps est un entier, seules les esp premires tuiles sont dessines.\
  <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=[4,8,10],0.01,html\
[8,8,4],0.01,html color=blue type=kite\
[5,8,3],0.01,color=black html type=kite\
[6,8,10],0.1,html color=[blue,grey] fill\
[6,8,10],0.1,color=blue html depl=[1,0.5,1]\
[6,8,10],6,html color=blue\
[5,8,3],0.04,color=black html type=kite\
[5,8,3],0.04,color=black html type=kite depl=[1,0.5,1]\
[4,6,0.7],0.01, html type=parallelogram\
[6,8,10],0.1,html fill=[1,5,7]\
[5,6,0.5],0.01, html color=[grey,blue] type=parallelogram fill=[1,2,3,4,5,6,7]\
[34,5,34],0.1,html\
[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,6,0.7],0.01, html type=parallelogram

!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=pavage_hyper
!if $slib_bound<0.01
  !!reset slib_bound
!endif
!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
!if $slib_type=$empty
  !set slib_type=triangle
!endif
!set slib_depl=!getopt depl in $slib_option
!default slib_depl=1,0,0
!set slib_pqr=!declosing $slib_data
!set slib_pqr=!exec pari [$slib_pqr]
!if $(slib_pqr[1])<=2 or $(slib_pqr[2])<=2 or ($slib_type notwordof regular parallelogram and $(slib_pqr[3])<=2)
  slib_out=Error pas d'angle plat
  !exit
!endif
!if $slib_type issametext kite
  !if ($[$(slib_pqr[2])%2]=1 and $(slib_pqr[1])!=$(slib_pqr[3]))\
  or $[1/$(slib_pqr[1])+2/$(slib_pqr[2])+1/$(slib_pqr[3])]>1
    slib_out=Error $slib_type
    !exit
  !endif
  !set slib_testint=!exec pari t=[$slib_pqr]; t-round(t)==0
  !if $slib_testint!=1
    slib_out= Error integers
  !exit
  !endif
!endif
!if $slib_type issametext parallelogram
  !if $[1/$(slib_pqr[1])+1/$(slib_pqr[2])]>=1/2 or $(slib_pqr[3])>=1 or \
    (($[$(slib_pqr[2])%2]=1 or $[$(slib_pqr[2])%2]=1) and $(slib_pqr[3])!=1/2)
    slib_out=Error $slib_type
    !exit
  !endif
  !set slib_testint=!exec pari t=[$(slib_pqr[1,2])]; t-round(t)==0
  !if $slib_testint!=1
    slib_out= Error integers
    !exit
  !endif
!endif
!if $slib_type issametext triangle
  !if 1/$(slib_pqr[1]) + 1/$(slib_pqr[2])+1/$(slib_pqr[3])>=1/2 or\
    ($[$(slib_pqr[1])%2]=1 and $(slib_pqr[2])!=$(slib_pqr[3])) or\
    ($[$(slib_pqr[2])%2]=1 and $(slib_pqr[1])!=$(slib_pqr[3])) or\
    ($[$(slib_pqr[3])%2]=1 and $(slib_pqr[2])!=$(slib_pqr[1]))
    slib_out=Error $slib_type
    !exit
  !endif
  !set slib_testint=!exec pari t=[$slib_pqr]; t-round(t)==0
  !if $slib_testint!=1
    slib_out=Error triangle
    !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_testint=!exec pari t=[$slib_pqr]; t-round(t)==0
  !if $slib_testint!=1
    slib_out=Error integers
    !exit
  !endif
!endif
!set wims_multiexec=$wims_multiexec pari
!if $slib_header_coxhyp=
  !readproc gp/$slib_gpprog.gp
  !set slib_coxhyp=!exec pari tikz=0;$slib_header_coxhyp;
!endif
!set slib_coxhyp=!exec pari wwww=$slib_type($slib_pqr,$slib_bound,[$slib_depl]);default(realprecision,3);wwww
!set slib_data=!trim $slib_coxhyp
!! 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
