The following will plot the surface of a given function from
.
(This is a bit more complicated, so I don't want to include as
much error checking for the inputs.)
The graphics here will be the function
proc g {x y} {expr sqrt(abs($x*$y))}
proc draw_surface { f } {
set minx -5
set maxx 5
set miny -5
set maxy 5
set step 0.5
# first, get the data (this isn't the most data efficient way of
# doing things)
for {set i $minx} {$i <= $maxx} {set i [expr $i + $step]} {
for {set j $miny} {$j <= $maxy} {set j [expr $j + $step]} {
set data($i,$j) [$f $i $j]
}
}
# make another pass through to plot it
for {set i $minx} {$i <= [expr $maxx - $step]} {set i [expr $i + $step]} {
for {set j $miny} {$j <= [expr $maxy - $step]} {set j [expr $j + $step]} {
# get the next two corners
set i2 [expr $i + $step]
set j2 [expr $j + $step]
# find the middle
set imiddle [expr $i + $step/2]
set jmiddle [expr $j + $step/2]
set kmiddle [expr ($data($i,$j) + $data($i2,$j) + $data($i2,$j2) \
+ $data($i,$j2)) / 4.0]
# use a cool coloring scheme (this depends on the graph having a min
# value of 0 and max of 5, or at least less than about 30)
draw color [expr 17 + [int [expr 200 * $kmiddle]] % 1024]
# make 4 triangles
draw triangle "$i $j $data($i,$j)" "$imiddle $jmiddle $kmiddle" \
"$i2 $j $data($i2,$j)"
draw triangle "$i $j $data($i,$j)" "$i $j2 $data($i,$j2)" \
"$imiddle $jmiddle $kmiddle"
draw triangle "$i2 $j2 $data($i2,$j2)" "$i2 $j $data($i2,$j)" \
"$imiddle $jmiddle $kmiddle"
draw triangle "$i2 $j2 $data($i2,$j2)" "$imiddle $jmiddle $kmiddle" \
"$i $j2 $data($i,$j2)"
}
}
}
And graph it with the command:
draw_surface gLooks like it should be on a quilt, doesn't it?