Triangle de sierpinski avec xor

 

dc 05/07/06 Tout est dans le titre...

 # à changer pour faire plus grand/petit
 set l 128
 array set c {0 black 1 white}

 proc xor {a b} {
     expr {$a+$b==1}
 }

 proc gui {l} {
     pack [canvas .c -width $l -height $l \
 	      -bg $::c(1) -highlightt 0]
     image create photo monImg -width $l -height $l
     .c create image 0 0 -image monImg -anchor nw
 }

 proc matrice {dim} {
     for {set i 0} {$i<$dim} {incr i} {
 	set ::m($i,0) 1
 	for {set j 1} {$j<$i} {incr j} {
 	    # la ligne commentée suivante est l'idée de base mais finalement plus
 	    # longue que ma procédure xor, c'est la fonction  builtin xor : a^b
 	    #set ::m($i,$j) [expr {$::m([expr {$i-1}],$j)^$::m([expr {$i-1}],[expr {$j-1}])}]
 	    set ::m($i,$j) [xor $::m([expr {$i-1}],$j) $::m([expr {$i-1}],[expr {$j-1}])]
 	}
 	for {set j $i} {$j<$dim} {incr j} {
 	    set ::m($i,$j) 0
 	}
     }
 }

 proc dessineMatrice {on off dim} {
     set c(0) $off
     set c(1) $on
     for {set j 0} {$j<$dim} {incr j} {
 	set ligne ""
 	set engil ""
 	for {set i 0} {$i<$dim} {incr i} {
 	    lappend ligne $c($::m($i,$j))
 	    set engil "$c($::m($i,$j)) $engil"
 	}
 	monImg put [list $ligne] -to 0 [expr {$dim-$j}]\
 	    $dim [expr {$dim-$j+1}]
 	monImg put [list $ligne] -to 0 [expr {$dim+$j}]\
 	    $dim [expr {$dim+$j+1}]
 	monImg put [list $engil] -to $dim [expr {$dim+$j}]\
 	    [expr {2*$dim}] [expr {$dim+$j+1}]
 	monImg put [list $engil] -to $dim [expr {$dim-$j}]\
 	    [expr {2*$dim}] [expr {$dim-$j+1}]
 	update
     }
 }

 gui [expr {$l*2}]
 matrice $l
 dessineMatrice $c(0) $c(1) $l

Voir aussi Tetraèdre avec 3dcanvas