Subversion Repositories wimsdev

Rev

Rev 4158 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
20 reyssat 1
!if $wims_read_parm!=slib_header
2
 !goto proc
3
!endif
4
slib_title=Random tree
5
slib_parms=3\
6
,N approximative number of nodes\
7
,s maximum degree\
8
,h height\
9
, text\
10
, option words : perfect (all nodes have same degree), middle, point
11
slib_author=Bernadette PERRIN-RIOU
12
slib_out=[code for draw of a tree to be used with draw], \
13
[liste of nodes and children],[position of nodes],\
14
[position of points on vertices]
15
slib_comment=option middle : circle on middle of the edges;\
16
option point : circle on vertices
17
slib_example= 5,3,3,,perfect middle
18
 
19
!exit
20
 
21
:proc
22
 
23
!distribute item $wims_read_parm into slib_N,slib_s,slib_h,slib_text
24
slib_option = !item 5 to -1 of $wims_read_parm
25
!default slib_s=5
26
!default slib_h =8
27
!default slib_color1=blue
28
!default slib_color2=green
29
!default slib_color3 = yellow
30
slib_text=!declosing $slib_text
31
slib_G = 1
32
slib_cnt = 1
33
slib_n = $[2*$slib_N]
34
slib_A1 =0
35
slib_height1 =1
36
slib_sizey =1
37
slib_cnt1 = 0
38
slib_width1 =15
39
slib_Sizey = $[$slib_h+1]
40
slib_choix1=!values 1 for x = 1 to $[$slib_s+3]
41
slib_choix0=!values 0 for x = 1 to $[$slib_s-3]
42
slib_noeud= !random 0,1 repeat $n
43
#permet d'assurer que l'arbre ne part pas avec une seule branche (inutile dans le cas parfait)
44
slib_noeud = 1,$slib_noeud
45
slib_choix=$slib_choix1, $slib_choix0
46
slib_position =$empty
47
slib_milieu =0,-1
48
!for slib_k = 1 to $slib_n
49
	slib_L = !line $slib_k of $slib_G
50
	!if $slib_L<>$empty
51
		slib_i=!item 1 of $slib_L
52
		slib_position_prov=$(slib_A$slib_i),$[-$(slib_height$slib_i)]
53
		slib_position = !append line  $slib_position_prov to $slib_position
54
		!if $slib_cnt > $[$slib_N] or $slib_sizey > $slib_Sizey
55
		!else	
56
#choix des fils (position et nombre : la position est-elle intéressante pour un arbre non binaire ? )	
57
			slib_c=!item $slib_k  of $slib_noeud
58
			!if perfect iswordof of $slib_option or $slib_c = 1
59
				slib_a =!item 1 to $slib_s of $slib_choix1
60
			!else
61
				slib_a =!shuffle $slib_choix
62
				slib_a=!item 1 to $slib_s of $slib_a
63
			!endif	
64
			slib_Li =
65
			!for slib_j = 1 to $slib_s
66
				slib_b=!item $slib_j of $slib_a
67
				!if $slib_b <> 0
68
#creation d'un fils
69
					slib_jj =$[$slib_cnt+1]
70
#sa hauteur
71
					slib_height$slib_jj= $[$(slib_height$slib_i)+1]
72
#la hauteur de l'arbre
73
					slib_sizey=$[max($slib_sizey, $(slib_height$slib_jj))]
74
# Ne sert à rien ? 				
75
					slib_cnt$(slib_height$slib_jj)=$[$(slib_cnt$(slib_height$slib_jj))+1]
76
#on rajoute une ligne pour le fils
77
					slib_G =!append line $slib_jj to $slib_G
78
#nombre de sommets
79
					slib_cnt = $[$slib_cnt +1]
80
				!else 
81
					slib_jj=sentinelle
82
				!endif
83
#on rajoute le fils sur la ligne du père, rien s'il n'y a rien à cette position
84
				slib_Li =!append item $slib_jj to $slib_Li
85
#le calcul suivant sert pour le dessin. Faut-il le mettre ici ? 			
86
				!if $slib_b <> 0
87
#position
88
					slib_A$slib_jj=$[$(slib_A$slib_i)+($slib_j-($slib_s+1)/2)*$(slib_width$slib_i)]
89
#calcul de la largeur donnée au sommet $slib_jj pour ses fils éventuels
90
					slib_width$slib_jj=$[$(slib_width$slib_i)/min($slib_s,$slib_s+1)]	
91
					slib_milieu_prov=$[($(slib_A$slib_i)+2*$(slib_A$slib_jj))/3],$[-($(slib_height$slib_i) +2*$(slib_height$slib_jj))/3]
92
			 		slib_milieu = !append line $slib_milieu_prov to $slib_milieu
93
				!endif
94
			!next slib_j	
95
#on met la ligne $slib_k définitive
96
  		slib_G = !replace line number $slib_k by $slib_L,$slib_Li in $slib_G	
97
		!endif	
98
  !endif
99
!next slib_k
100
 
101
#Trace du dessin
102
slib_dessin =xrange $[-$slib_s*$slib_width1/2],$[$slib_s*$slib_width1/2]\
103
yrange $[-$slib_Sizey-0.5],-0.5\
104
linewidth 2
105
slib_cnt =!linecnt $slib_G
106
 
107
!for slib_k= 1 to $slib_cnt 
108
	slib_u =!line $slib_k of $slib_G
109
	slib_i=!item 1 of $slib_u
110
	slib_position_prov=!line $slib_k of $slib_position
111
	!for slib_j in $slib_u
112
		!if $slib_j  notsametext sentinelle
113
#trace de la droite
114
			slib_position_prov1=!line $slib_j of $slib_position
115
			slib_dessin = !append line line  $slib_position_prov,$slib_position_prov1, $slib_color1\
116
			 to $slib_dessin
117
#on coupe les segments au milieu pour mettre un cercle et éventuellement du texte			
118
			!if middle iswordof $slib_option
119
				slib_milieu_prov=!line $slib_j of $slib_milieu
120
				slib_dessin = !append line disk $slib_milieu_prov,30,white\
121
circle $slib_milieu_prov, 30,$slib_color3 to $slib_dessin	
122
			!endif
123
		!endif
124
	!next slib_j		
125
	!if point iswordof $slib_option
126
		slib_dessin =!append line disk $slib_position_prov,30,white\
127
	  circle $slib_position_prov,30,$slib_color2 to $slib_dessin
128
	!endif
129
	!if $slib_text <> $empty
130
		slib_textk=!item $slib_k of $slib_text
131
		slib_dessin =!append line text black,$slib_position_prov, medium,$slib_textk to $slib_dessin
132
	!endif
133
!next slib_k	
134
slib_out = [$slib_dessin], [$slib_G],[$slib_position],[$slib_milieu]