uniquename 2013aug17For those who will never have the time/opportunity/whatever to run the code below, here are a couple of images that show the nice appearance of this GUI --- and how just switching the black disks with the white disks can make the lines (appear to?) bulge inward rather than outward.
2017-09-29: Online demo at [1]
#!/bin/sh -*- tab-width: 8; -*- # The next line is executed by /bin/sh, but not tcl \ exec wish $0 ${1+"$@"} ##+############################################################# # # bulging.tcl -- whizzlet demonstrating the bulging line illusion # by Keith Vetter # package require Tk set G \#848484 set L \#C4C4C4 set B \#040404 set W \#FEFEFE set S(m) 30 ;# Margin set S(r) 10 ;# Circle radius set S(colors) "GLWB" ;# Coloring scheme proc DoDisplay {} { wm title . "Bulging Line Illusion" pack [frame .bottom] -side bottom -fill x canvas .c -width 400 -height 400 -bd 2 -relief raised -bg \#C0DEC4 pack .c -side top -fill both -expand 1 scale .size -from 5 -to 15 -orient horizontal -showvalue 0 \ -variable S(r) -label "Circle Size" -command DrawCircles radiobutton .c1 -text "GLWB" -variable S(colors) -value "GLWB" \ -command Colorize radiobutton .c2 -text "GLBW" -variable S(colors) -value "GLBW" \ -command Colorize pack .size -side left -in .bottom pack .c2 .c1 -side right -in .bottom image create photo ::img::blank -width 1 -height 1 button .about -image ::img::blank -highlightthickness 0 -command About place .about -in .bottom -relx 1 -rely 0 -anchor ne bind all <Alt-c> [list console show] bind .c <Configure> DrawBoard update } proc DrawBoard {} { global S .c delete c0 c1 c2 c3 set S(w) [expr {([winfo width .c] - 2*$S(m)) / 9.0}] set S(h) [expr {([winfo height .c] - 2*$S(m)) / 9.0}] .size config -to [expr {int(($S(w) < $S(h) ? $S(w) : $S(h))/2)}] for {set row 0} {$row < 9} {incr row} { for {set col 0} {$col < 9} {incr col} { set xy [GetXY $row $col] .c create rect $xy -tag "c[expr {($row + $col) % 2}]" -outline {} } } DrawCircles for {set row 1} {$row < 9} {incr row} { foreach {x1 y1} [GetXY $row 1] break foreach {x2 y2} [GetXY $row 8] break .c create line $x1 $y1 $x2 $y2 -tag {c1 line} } for {set col 1} {$col < 9} {incr col} { foreach {x1 y1} [GetXY 1 $col] break foreach {x2 y2} [GetXY 8 $col] break .c create line $x1 $y1 $x2 $y2 -tag {c1 line} } Colorize } # Colorize -- sets the correct color for every item on the canvas proc Colorize {} { foreach id {0 1 2 3} { set color [set ::[string index $::S(colors) $id]] .c itemconfig c$id -fill $color catch {.c itemconfig c$id -outline $color} } } proc DrawCircles {args} { global S if {! [info exists S(w)]} return set id1 {3 2 3 2 2 3 2 3 2 3 2 3 3 2 3 2} ;# Color each gets set id2 {2 3 2 3 3 2 3 2 3 2 3 2 2 3 2 3} set ids [concat $id1 $id1 $id2 $id2] .c delete circle for {set row 1} {$row < 9} {incr row} { for {set col 1} {$col < 9} {incr col} { foreach {x y} [GetXY $row $col] break set xy [Box $x $y $S(r)] set id [lindex $ids 0] ; set ids [lrange $ids 1 end] .c create oval $xy -tag [list c$id circle] } } Colorize .c raise line } proc Box {x y r} { return [list [expr {$x-$r}] [expr {$y-$r}] [expr {$x+$r}] [expr {$y+$r}]] } proc GetXY {row col} { global S set x1 [expr {$S(m) + $col * $S(w)}] set y1 [expr {$S(m) + $row * $S(h)}] set x2 [expr {$x1 + $S(w)}] set y2 [expr {$y1 + $S(h)}] return [list $x1 $y1 $x2 $y2] } proc About {} { set msg "Bulging Line Illusion\nby Keith Vetter, February 2003\n\n" append msg "A whizzlet for visualizing the Bulging Line Illusion.\n\n" append msg "The Bulging Line Illusion was invented by Japanese artist\n" append msg "Akiyoshi Kitaoka. So named because for some distributions of\n" append msg "colors, e.g. GLWB, the lines appear to bulge. For other\n" append msg "distributions they appear to bend inwards.\n\n" append msg "(G is gray, L is light gray, B is black and W is white.)\n" tk_messageBox -title "About Bulging Line Illusion" -message $msg } DoDisplay