proc f {u v} { expr {$u * sin($u) * cos($v)} } proc g {u v} { expr {$u * cos($u) * cos($v)} } proc h {u v} { expr {$u * sin($v)} } proc draw_surface { f g h } { set PI 3.14159 set minu 0 set maxu [expr $PI * 3] set stepu [expr $maxu / 32] set minv 0 set maxv [expr $PI] set stepv [expr $maxv / 32] # first, get the data (this isn't the most data efficient way of # doing things) for {set u $minu} {$u <= $maxu} {set u [expr $u + $stepu]} { for {set v $minv} {$v <= $maxv} {set v [expr $v + $stepv]} { set fdata($u,$v) [$f $u $v] set gdata($u,$v) [$g $u $v] set hdata($u,$v) [$h $u $v] } } # make another pass through to plot it set cnum [colorinfo num] set cmax [colorinfo max] for {set u $minu} {$u < $maxu} {set u [expr $u + $stepu]} { for {set v $minv} {$v < $maxv} {set v [expr $v + $stepv]} { # get the next two corners set u2 [expr $u + $stepu] set v2 [expr $v + $stepv] draw color [expr $cnum + (int($cmax * $u / $maxu) + int($cmax * $v / $maxv)) % $cmax] draw triangle "$fdata($u,$v) $gdata($u,$v) $hdata($u,$v)" \ "$fdata($u2,$v) $gdata($u2,$v) $hdata($u2,$v)" \ "$fdata($u2,$v2) $gdata($u2,$v2) $hdata($u2,$v2)" draw triangle "$fdata($u2,$v2) $gdata($u2,$v2) $hdata($u2,$v2)" \ "$fdata($u,$v2) $gdata($u,$v2) $hdata($u,$v2)" \ "$fdata($u,$v) $gdata($u,$v) $hdata($u,$v)" } } }