package require Tk

if 0 {
 First handle a 10x1

 10 0's

 1 0 0 0 0 0 0 0 0 0
 0 1 0 0 0 0 0 0 0 0
 0 0 1 0 0 0 0 0 0 0
 0 0 0 1 0 0 0 0 0 0
 0 0 0 0 1 0 0 0 0 0
 0 0 0 0 0 1 0 0 0 0
 0 0 0 0 0 0 1 0 0 0
 0 0 0 0 0 0 0 1 0 0
 0 0 0 0 0 0 0 0 1 0
 0 0 0 0 0 0 0 0 0 1
 1 1 0 0 0 0 0 0 0 0
 1 0 1 0 0 0 0 0 0 0
 1 0 0 1 0 0 0 0 0 0
 1 0 0 0 1 0 0 0 0 0
 1 0 0 0 0 1 0 0 0 0
 1 0 0 0 0 0 1 0 0 0
 1 0 0 0 0 0 0 1 0 0
 1 0 0 0 0 0 0 0 1 0
 1 0 0 0 0 0 0 0 0 1
   
  
}

proc init.array size {
 for {set i 0} {$i < $size} {incr i} {
  set ::points($i) -1
 }

 #start off with 16 pixels to save us time and disk space

 for {set i 0} {$i < 16} {incr i} {
  set ::points($i) $i
 }
}

proc generate.image {img size} {
 $img blank

 set cursor 0

 while 1 {
  incr ::points($cursor)
  if {$::points($cursor) >= $size} {
   set ::points($cursor) 0
   incr cursor
  } else {
   break
  }
 }

 for {set p 0} {$p < $size} {incr p} {
  if {$::points($p) < 0} {
   break
  }
  set y [expr {$::points($p) / [$img cget -width]}]
  set x [expr {$::points($p) % [$img cget -width]}]

  $img put "#000000" -to $x $y
 }
}

proc do.generation {img size} {
 set last [expr {$size - 1}]

 if {$::points($last) > [$img cget -width]} {
  return
 }

 # do 3 iterations for testing (before doing our continuation)
 generate.image $img $size
 generate.image $img $size
 generate.image $img $size

 after 1 [list do.generation $img $size]
}


proc main {} {

 set width 50
 set height 50

 . config -bg blue

 set img [image create photo -width $width -height $height]

 set size [expr {$width * $height}]
 init.array $size

 pack [label .l -image $img]

 do.generation $img $size
}
main
