You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
2.6 KiB
104 lines
2.6 KiB
2 years ago
|
# This example demonstrates how to use a programmable filter and how to use
|
||
|
# the special vtkDataSetToDataSet::GetOutput() methods
|
||
|
|
||
|
# first we load in the standard vtk packages into tcl
|
||
|
package require vtk
|
||
|
package require vtkinteraction
|
||
|
package require vtktesting
|
||
|
|
||
|
#
|
||
|
# We create a 100 by 100 point plane to sample
|
||
|
#
|
||
|
vtkPlaneSource plane
|
||
|
plane SetXResolution 100
|
||
|
plane SetYResolution 100
|
||
|
|
||
|
#
|
||
|
# We transform the plane by a factor of 10 on X and Y
|
||
|
#
|
||
|
vtkTransform transform
|
||
|
transform Scale 10 10 1
|
||
|
vtkTransformPolyDataFilter transF
|
||
|
transF SetInputConnection [plane GetOutputPort]
|
||
|
transF SetTransform transform
|
||
|
|
||
|
#
|
||
|
# Compute Bessel function and derivatives. We'll use a programmable filter
|
||
|
# for this. Note the unusual GetInput() & GetOutput() methods.
|
||
|
#
|
||
|
vtkProgrammableFilter besselF
|
||
|
besselF SetInputConnection [transF GetOutputPort]
|
||
|
besselF SetExecuteMethod bessel
|
||
|
|
||
|
#
|
||
|
# The SetExecuteMethod takes a Tcl proc as an argument
|
||
|
# In here is where all the processing is done.
|
||
|
#
|
||
|
proc bessel {} {
|
||
|
set input [besselF GetPolyDataInput]
|
||
|
set numPts [$input GetNumberOfPoints]
|
||
|
vtkPoints newPts
|
||
|
vtkFloatArray derivs
|
||
|
|
||
|
for {set i 0} {$i < $numPts} {incr i} {
|
||
|
set x [$input GetPoint $i]
|
||
|
set x0 [lindex $x 0]
|
||
|
set x1 [lindex $x 1]
|
||
|
|
||
|
set r [expr sqrt($x0*$x0 + $x1*$x1)]
|
||
|
set x2 [expr exp(-$r) * cos(10.0*$r)]
|
||
|
set deriv [expr -exp(-$r) * (cos(10.0*$r) + 10.0*sin(10.0*$r))]
|
||
|
|
||
|
newPts InsertPoint $i $x0 $x1 $x2
|
||
|
eval derivs InsertValue $i $deriv
|
||
|
}
|
||
|
|
||
|
[besselF GetPolyDataOutput] CopyStructure $input
|
||
|
[besselF GetPolyDataOutput] SetPoints newPts
|
||
|
[[besselF GetPolyDataOutput] GetPointData] SetScalars derivs
|
||
|
|
||
|
newPts Delete; #reference counting - it's ok
|
||
|
derivs Delete
|
||
|
}
|
||
|
|
||
|
#
|
||
|
# We warp the plane based on the scalar values calculated above
|
||
|
#
|
||
|
vtkWarpScalar warp
|
||
|
warp SetInput [besselF GetPolyDataOutput]
|
||
|
warp XYPlaneOn
|
||
|
warp SetScaleFactor 0.5
|
||
|
|
||
|
#
|
||
|
# We create a mapper and actor as usual. In the case we adjust the
|
||
|
# scalar range of the mapper to match that of the computed scalars
|
||
|
#
|
||
|
vtkPolyDataMapper mapper
|
||
|
mapper SetInput [warp GetPolyDataOutput]
|
||
|
eval mapper SetScalarRange [[besselF GetPolyDataOutput] GetScalarRange]
|
||
|
vtkActor carpet
|
||
|
carpet SetMapper mapper
|
||
|
|
||
|
#
|
||
|
# Create the RenderWindow, Renderer
|
||
|
#
|
||
|
vtkRenderer ren1
|
||
|
vtkRenderWindow renWin
|
||
|
renWin AddRenderer ren1
|
||
|
vtkRenderWindowInteractor iren
|
||
|
iren SetRenderWindow renWin
|
||
|
|
||
|
ren1 AddActor carpet
|
||
|
renWin SetSize 500 500
|
||
|
|
||
|
# render the image
|
||
|
#
|
||
|
iren AddObserver UserEvent {wm deiconify .vtkInteract}
|
||
|
ren1 ResetCamera
|
||
|
[ren1 GetActiveCamera] Zoom 1.5
|
||
|
renWin Render
|
||
|
|
||
|
# prevent the tk window from showing up then start the event loop
|
||
|
wm withdraw .
|
||
|
|