File: randtree

package info (click to toggle)
wims 2%3A4.29a%2Bdfsg1-3
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 185,704 kB
  • sloc: xml: 366,687; javascript: 120,570; ansic: 62,341; java: 62,170; sh: 7,744; perl: 3,937; yacc: 3,217; cpp: 1,915; lex: 1,805; makefile: 1,084; lisp: 914; pascal: 601; python: 520; php: 318; asm: 7
file content (144 lines) | stat: -rw-r--r-- 5,251 bytes parent folder | download | duplicates (2)
1
2
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
!if $wims_read_parm!=slib_header
  !goto proc
!endif
slib_author=Bernadette, Perrin-Riou

slib_example=5,3,3,,perfect middle\
5,3,3,,perfect middle html\
12,2,4,[A,B,C,D],point html\
70,2,10,,point html

!exit

:proc
!reset slib_segments slib_dessin
!distribute item $wims_read_parm into slib_N,slib_s,slib_h,slib_text
slib_option = !item 5 to -1 of $wims_read_parm
!default slib_s=5
!default slib_h=8
!default slib_color1=blue
!default slib_color2=green
!default slib_color3=yellow
slib_text=!declosing $slib_text
slib_G = 1
slib_cnt = 1
slib_n = $[2*$slib_N]
slib_A1 =0
slib_height1=1
slib_sizey=1
slib_cnt1=0
slib_width1=15
slib_Sizey=$[$slib_h+1]
slib_height=5
slib_choix1=!values 1 for x=1 to $[$slib_s+3]
slib_choix0=!values 0 for x=1 to $[$slib_s-3]
slib_noeud= !random 0,1 repeat $n
#permet d'assurer que l'arbre ne part pas avec une seule branche (inutile dans le cas parfait)
slib_noeud=1,$slib_noeud
slib_choix=$slib_choix1, $slib_choix0
slib_position=$empty
slib_milieu=0,-1
!for slib_k=1 to $slib_n
  slib_L=!line $slib_k of $slib_G
  !if $slib_L<>$empty
    slib_i=!item 1 of $slib_L
    slib_position_prov=$(slib_A$slib_i),$[-$(slib_height$slib_i)]
    slib_position=!append line $slib_position_prov to $slib_position
    !if $slib_cnt > $[$slib_N] or $slib_sizey > $slib_Sizey

    !else
      #choix des fils (position et nombre : la position est-elle intressante pour un arbre non binaire ? )
      slib_c=!item $slib_k of $slib_noeud
      !if perfect iswordof of $slib_option or $slib_c=1
        slib_a=!item 1 to $slib_s of $slib_choix1
      !else
        slib_a=!shuffle $slib_choix
        slib_a=!item 1 to $slib_s of $slib_a
      !endif
      slib_Li=
      !for slib_j=1 to $slib_s
        slib_b=!item $slib_j of $slib_a
        !if $slib_b <> 0
          #creation d'un fils
          slib_jj=$[$slib_cnt+1]
          #sa hauteur
          slib_height$slib_jj= $[$(slib_height$slib_i)+1]
          #la hauteur de l'arbre
          slib_sizey=$[max($slib_sizey, $(slib_height$slib_jj))]
          # Ne sert  rien ?
          slib_cnt$(slib_height$slib_jj)=$[$(slib_cnt$(slib_height$slib_jj))+1]
          #on rajoute une ligne pour le fils
          slib_G=!append line $slib_jj to $slib_G
          #nombre de sommets
          slib_cnt=$[$slib_cnt +1]
        !else
          slib_jj=sentinelle
        !endif
        #on rajoute le fils sur la ligne du pre, rien s'il n'y a rien  cette position
        slib_Li=!append item $slib_jj to $slib_Li
        #le calcul suivant sert pour le dessin. Faut-il le mettre ici ?
        !if $slib_b <> 0
          #position
          slib_A$slib_jj=$[$(slib_A$slib_i)+($slib_j-($slib_s+1)/2)*$(slib_width$slib_i)]
          #calcul de la largeur donne au sommet $slib_jj pour ses fils ventuels
          slib_width$slib_jj=$[$(slib_width$slib_i)/min($slib_s,$slib_s+1)]
          slib_milieu_prov=$[($(slib_A$slib_i)+2*$(slib_A$slib_jj))/3],$[-($(slib_height$slib_i) +2*$(slib_height$slib_jj))/3]
          slib_milieu=!append line $slib_milieu_prov to $slib_milieu
        !endif
      !next slib_j
      #on met la ligne $slib_k dfinitive
      slib_G=!replace line number $slib_k by $slib_L,$slib_Li in $slib_G
    !endif
  !endif
!next slib_k

#Trace du dessin
!set slib_xrange=$[-$slib_s*$slib_width1/2],$[$slib_s*$slib_width1/2]
!set slib_yrange=$[-$slib_sizey-0.5],-0.5
slib_cnt=!linecnt $slib_G
!for slib_k=1 to $slib_cnt
  slib_u=!line $slib_k of $slib_G
  slib_i=!item 1 of $slib_u
  slib_position_prov=!line $slib_k of $slib_position
  !for slib_j in $slib_u
    !if $slib_j notsametext sentinelle
      #trace de la droite
      slib_position_prov1=!line $slib_j of $slib_position
      slib_segments=!append item $slib_position_prov,$slib_position_prov1 to $slib_segments
      #on coupe les segments au milieu pour mettre un cercle et ventuellement du texte
      !if middle iswordof $slib_option
        slib_milieu_prov=!line $slib_j of $slib_milieu
        slib_dessin = !append line disk $slib_milieu_prov,30,white\
circle $slib_milieu_prov, 30,$slib_color3 to $slib_dessin
      !endif
    !endif
  !next slib_j
  !if point iswordof $slib_option
    slib_dessin =!append line disk $slib_position_prov,30,white\
      circle $slib_position_prov,30,$slib_color2 to $slib_dessin
  !endif
  !if $slib_text <> $empty
    slib_textk=!item $slib_k of $slib_text
    slib_dessin =!append line text black,$slib_position_prov, medium,$slib_textk to $slib_dessin
  !endif
!next slib_k
slib_dessin=xrange $slib_xrange\
yrange $slib_yrange\
linewidth 2\
segments $slib_color1,$slib_segments\
$slib_dessin
slib_out=$slib_dessin
!if url iswordof $slib_option or html iswordof $slib_option
  !set slib_tmp=400
  !set insdraw_size=$slib_tmp,$[($(slib_yrange[2])-($(slib_yrange[1])))/($(slib_xrange[2])-($(slib_xrange[1])))*$slib_tmp*$slib_height]
  !set insdraw_size=$[min(1500,($(slib_xrange[2])-($(slib_xrange[1])))/($(slib_yrange[2])-($(slib_yrange[1])))*$slib_tmp)],$slib_tmp
!insdraw $slib_out
  slib_out=$ins_url
  !if html iswordof $slib_option
    slib_out=<img src="$ins_url" alt="">
  !else
    slib_out=$slib_out,[$slib_G],[$slib_position],[$slib_milieu],$insdraw_size
  !endif
!else
  slib_out=[$slib_dessin],[$slib_G],[$slib_position],[$slib_milieu]
!endif