#!/usr/bin/wish -f # -*- mode: tcl -*- wm title . "ロールケーキいじり" scale .height -variable height -from 40 -to 0 -resolution 0.1 \ -orient vertical -showvalue false -command redraw canvas .canvas -width 300 -height 300 scale .length -variable length -from 30 -to 5 -resolution 0.5 \ -orient vertical -showvalue false -command redraw pack .height .canvas .length -side left -fill y bind . { switch %K { f {.height set [expr [.height get] + 1.0]} d {.height set [expr [.height get] - 1.0]} j {.length set [expr [.length get] + 1.5]} k {.length set [expr [.length get] - 1.5]} q exit } } proc redraw {dummy} { global height length set view [expr {60 * acos(-1) / 180}] set resolution 200 .canvas delete cake set points {} for {set i 0} {$i <= $resolution} {incr i} { # compute the spiral set u [expr {double($i) / $resolution}] set phi [expr {$length * $u}] set r [expr {$length * (1 - $u)}] set x [expr {cos($phi) * $r}] set y [expr {sin($phi) * $r}] set z [expr {$height * $u}] # rotation around the X axis set y [expr {cos($view) * $y + sin($view) * $z}] # convert to display coordinates set x [expr {$x * 5 + 150}] set y [expr {230 - $y * 5}] # add to the point list lappend points $x $y } .canvas create line $points -tags cake -width 2 } redraw {}