package require vtk
package require vtkinteraction
set F "x*y*z"
set dim 20
set minX -10
set maxX 10
set minY -10
set maxY 10
set minZ -10
set maxZ 10
set numContours 10
vtkRenderer ren1
ren1 SetBackground .1 .2 .4
vtkRenderWindow renWin
renWin AddRenderer ren1
renWin SetSize 600 600
vtkRenderWindowInteractor iren
iren SetRenderWindow renWin
iren AddObserver UserEvent {wm deiconify .vtkInteract}
iren Initialize
vtkFunctionParser parser
vtkFloatArray scalars
vtkStructuredPoints points
vtkContourFilter contours
contours SetInput points
contours SetComputeNormals 0
vtkDataSetMapper formulaMapper
formulaMapper SetInput [contours GetOutput]
vtkActor formulaActor
formulaActor SetMapper formulaMapper
ren1 AddActor formulaActor
proc graphIt {} {
global F dim minX maxX minY maxY minZ maxZ numContours
parser SetFunction $F
scalars SetNumberOfTuples [expr $dim * $dim * $dim]
set rangeX [expr $maxX - $minX]
set rangeY [expr $maxY - $minY]
set rangeZ [expr $maxZ - $minZ]
set minValue 9999999999
set maxValue -9999999999
for {set i 0} {$i < $dim} {incr i} {
set iOffset [expr $i * $dim * $dim]
set z [expr ($i * $rangeZ / double($dim)) + $minZ ]
parser SetScalarVariableValue z $z
for {set j 0} {$j < $dim} {incr j} {
set jOffset [expr $j * $dim]
set y [expr ($j * $rangeY / double($dim)) + $minY ]
parser SetScalarVariableValue y $y
for {set k 0} {$k < $dim} {incr k} {
set x [expr ($k * $rangeX / double($dim)) + $minX ]
set index [expr $k + $iOffset + $jOffset]
parser SetScalarVariableValue x $x
set value [parser GetScalarResult]
if {$value < $minValue } {set minValue $value}
if {$value > $maxValue } {set maxValue $value}
scalars SetTuple1 $index $value
}
}
}
points SetDimensions $dim $dim $dim
[points GetPointData] SetScalars scalars
contours GenerateValues $numContours $minValue $maxValue
formulaMapper SetScalarRange $minValue $maxValue
renWin Render
}
frame .func -relief groove -borderwidth 3
label .func.l1 -text "F(x, y, z) = "
entry .func.f -width 30 -textvariable F
button .func.graph -text "Graph It" -command {graphIt}
pack .func.l1 .func.f .func.graph -side left
frame .x
label .x.lx1 -text "Min X"
entry .x.minXent -width 10 -textvariable minX
label .x.lx2 -text "Max X"
entry .x.maxXent -width 10 -textvariable maxX
pack .x.lx1 .x.minXent .x.lx2 .x.maxXent -side left
frame .y
label .y.ly1 -text "Min Y"
entry .y.minYent -width 10 -textvariable minY
label .y.ly2 -text "Max Y"
entry .y.maxYent -width 10 -textvariable maxY
pack .y.ly1 .y.minYent .y.ly2 .y.maxYent -side left
frame .z
label .z.lz1 -text "Min Z"
entry .z.minZent -width 10 -textvariable minZ
label .z.lz2 -text "Max Z"
entry .z.maxZent -width 10 -textvariable maxZ
pack .z.lz1 .z.minZent .z.lz2 .z.maxZent -side left
frame .cont
label .cont.l1 -text "Contours"
entry .cont.num -width 10 -textvariable numContours
pack .cont.l1 .cont.num -side left
frame .res
label .res.l1 -text "Resolution"
entry .res.res -width 10 -textvariable dim
pack .res.l1 .res.res -side left
pack .func .x .y .z .cont .res
bind . <Key-Return> {
graphIt
}
graphIt