# Strang's strange patterns ...
canvas .c -width 600 -height 450 -background white
pack .c -fill both
for { set i 0 } { $i < 3600 } { incr i } {
set sini [expr {225+200.0*sin($i)}]
set tani [expr {225+100.0*tan($i)}]
set i2 [expr {$i/6}]
.c create rectangle $i2 $sini [expr {$i2+1}] [expr {$sini+1}] -outline red
.c create rectangle $i2 $tani [expr {$i2+1}] [expr {$tani+1}] -outline blue
}AM (22 september 2009) Here is a short program that produces Moire patterns in a slightly hypnotic way - just for fun.
# moire.tcl --
# Experiment with Moire patterns
#
pack [canvas .c -bg white -width 500 -height 500]
set xcentre 250
set ycentre 250
for {set i 1} {$i < 20} {incr i} {
set xul [expr {$xcentre - $i * 10}]
set yul [expr {$ycentre - $i * 10}]
set xbr [expr {$xcentre + $i * 10}]
set ybr [expr {$ycentre + $i * 10}]
.c create oval $xul $yul $xbr $ybr -width 3 -outline blue
.c create oval $xul $yul $xbr $ybr -width 3 -tag moving -outline green
.c create oval $xul $yul $xbr $ybr -width 3 -tag moving2 -outline red
}
set time 0.0
set dtime 0.02
proc position {time} {
set twopi [expr {8.0*atan(1.0)}]
# Note: incommensurable periods - so the pattern is not exactly repeating ...
set x [expr {4.0 * cos($twopi*$time)}]
set y [expr {4.0 * sin(1.4*$time)}]
return [list $x $y]
}
proc moveCircles {} {
global time
global dtime
foreach {xold yold} [position $time] {break}
foreach {xold2 yold2} [position -$time] {break}
set time [expr {$time + $dtime}]
foreach {xnew ynew} [position $time] {break}
foreach {xnew2 ynew2} [position -$time] {break}
.c move moving [expr {$xnew-$xold}] [expr {$ynew-$yold}]
.c move moving2 [expr {$xnew2-$xold2}] [expr {$ynew2-$yold2}]
after 10 moveCircles
}
moveCircles 
