Subversion Repositories wimsdev

Rev

Rev 16841 | Blame | Compare with Previous | Last modification | View Log | RSS feed

!if $wims_read_parm!=slib_header
  !goto proc
!endif

slib_title=Polygone tracé à partir des pentes (dessin)
slib_author=Bernadette, Perrin-Riou

slib_parms=3\
,list of slopes or vector of such lists\
,vector of colors [lines, points, axes, grid] or vector of such vectors\
,option: html, url, canvas

slib_author=Bernadette, Perrin-Riou
slib_out= drawing (or data for drawing)  of a polygon given by its slopes \
  (with repetition : each slope corresponds to an unit on x-axis).

slib_comment=

slib_example=[0,1,3,4,6,8],[red,black,green,grey],html\
[0,1,3,4,6,8],[red,black,green,grey],html canvas\
[[0,2,3,5],[1,3,6,7]],[[red,black,green],[navy,yellow]],html canvas\
[[0,2,3,5],[1,3,6,7],[2,3,7,5]],[[red,black,green],[navy,yellow],[yellow]],html\
[0,1,3,4,6,7],[red,black,green],html\
[0,1,1,1,2,3,4],[red,black],html\
[1/2,1/2,2/3,2/3,2/3],[red,,green],html\
[1/2,-1/2,1/2,4,-1,-3,-5],[red,black,green],html\
[1/2,-1/2,1/2,4,-1,-3,-5],[red,black,green],canvas\
[1/2,-1/2,1/2,4,-1,-3,-5],[red,black,green]

!exit

:proc

!distribute items $wims_read_parm into slib_slope, slib_color,slib_option
!reset slib_Ligne slib_Points
!default slib_cgraph1=black
!default slib_cpoint1=black
!set slib_slope_test=!declosing $slib_slope
!set slib_number=!itemcnt $slib_slope_test
!set slib_test=!item 1 of $slib_slope_test
!if , notin $slib_test
  !set slib_number=1
!else
  !set slib_slope=!declosing $slib_slope
  !set slib_color=!declosing $slib_color
!endif

pari_header_=(polygon (slope,decal)={\
  my (a,b, r=1, s, zero) ; nsl=1 ;\
  if (slope==0, return(0)) ;\
  line=matrix(#slope+1,2);\
  a=0 ; b=0 ; s=slope[1] ;\
  line[1,1]=0;line[1,2]=0;\
  for ( i=1, #slope, if( i < #slope, s1=slope[i+1],s1=jeton) ;\
     if(s1 == s, r=r + 1 ,\
         r=1 ;\
         line[nsl+1,1]=i ; line[nsl+1,2]=b+s ;\
         nsl=nsl+1;\
     ) ;\
     b=b+s ; s=s1 ;\
  ) ;\
  [matrix(nsl,2,i,j,line[i,j]+decal)] \
};)
!set pari_header=$pari_header_
!set slib_infini=!exec pari valuation(0,2)
!set slib_slope=!replace internal infty by $slib_infini in $slib_slope
!set slib_x1=-1
!set slib_x2=1
!set slib_y1=-1
!set slib_y2=1
!set slib_size1=2
!set slib_size2=2
!set slib_decal=0
!for slib_t=1 to $slib_number
  !set slib_color$slib_t=!declosing $(slib_color[$slib_t])
  !distribute items $(slib_color$slib_t) into slib_cgraph$slib_t,slib_cpoint$slib_t,slib_caxe$slib_t,slib_cquad$slib_t
  !default slib_cgraph$slib_t=$slib_cgraph1
  !default slib_cpoint$slib_t=$slib_cpoint1
  !set slib_slope$slib_t=$(slib_slope[$slib_t])
  !set slib_slope$slib_t=!declosing $(slib_slope$slib_t)
  !set slib_size1$slib_t=!itemcnt $(slib_slope$slib_t)
  !set slib_size1=$[max($slib_size1,$(slib_size1$slib_t))]
  !set slib_pol$slib_t=!exec pari $pari_header ; polygon([$(slib_slope$slib_t)],$slib_decal)
  !set slib_decal=$[$slib_decal + 0.05]
  !set slib_polygon$slib_t=!declosing $(slib_pol$slib_t)
  !set slib_tmp=$(slib_polygon$slib_t)
  !set slib_pointy$slib_t=$(slib_tmp[;2])
  !set slib_points$slib_t=!replace internal ; by , in $(slib_polygon$slib_t)
  !set slib_zero$slib_t=!declosing $(slib_tmp[2])
  !set slib_x2=$[max($(slib_size1$slib_t),$slib_x2)]
  !set slib_y1_=!replace internal $slib_infini by in $(slib_pointy$slib_t)
  !set slib_y1_=!declosing $(slib_y1_)
  !set slib_y1_=!nonempty items $(slib_y1_)
  !set slib_y1_=!sort numeric items $slib_y1_
  !set slib_y1=$[min($slib_y1,$(slib_y1_[1]))]
  !set slib_y2= $[max($slib_y2,$(slib_y1_[-1]))]
  !if $(slib_cgraph$slib_t)!=
    !set slib_Ligne=!append line polyline $(slib_cgraph$slib_t),$(slib_points$slib_t) to $slib_Ligne
  !endif
  !if $(slib_cpoint$slib_t)!=
    !set slib_Points=!append line points $(slib_cpoint$slib_t),$(slib_points$slib_t) to $slib_Points
  !endif
!next
!set slib_x2=$[$slib_x2+1]
!set slib_y1=$[$slib_y1-1]
!set slib_y2=$[$slib_y2+2]
!set slib_size1=$[$slib_size1+2]
!set slib_size2=$[$slib_y2 -$slib_y1 + 3]
!if canvas iswordof $slib_option
  !set slib_size_points=2
!else
  !set slib_size_points=4
!endif
!set slib_dessin=xrange $slib_x1,$slib_x2\
yrange $slib_y1,$slib_y2
!if $slib_cquad1!=
  slib_dessin=$slib_dessin\
parallel $slib_x1,$slib_y1,$slib_x1,$slib_y2,1,0,$slib_size1,$slib_cquad1\
parallel $slib_x1,$slib_y1,$slib_x2,$slib_y1,0,1,$slib_size2,$slib_cquad1
!endif
slib_dessin=$slib_dessin\
linewidth 2
!if $slib_caxe1!=
  slib_dessin=$slib_dessin\
hline 0,0,$slib_caxe1\
vline 0,0,$slib_caxe1
!endif
slib_dessin=$slib_dessin\
$slib_Ligne
!if $slib_cpoint1!=
  !set slib_dessin=$slib_dessin\
linewidth $slib_size_points\
$slib_Points\
linewidth 1
!endif
slib_out=$slib_dessin
!if canvas isin $slib_option
  slib_out=!exec canvasdraw size 300,300\
    $slib_out
!else
  !if url iswordof $slib_option or html iswordof $slib_option
    insdraw_size=300,300
    !insdraw $slib_out
    slib_out=$ins_url
    !if html iswordof $slib_option
      slib_out=<img src="$ins_url" alt="">
    !else
      slib_out=$slib_out,$insdraw_size
    !endif
  !endif
!endif