| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 
 | !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
 |