def streamline( point, time, ds, options={} )
accuracy = false
method = false
direction = false
color = false
type = false
width = false
normal = false
vary = false
vary_factor = false
tube_sides = false
options.each{ |key, val|
case key
when 'accuracy'
accuracy = val
when 'method'
method = val
when 'direction'
direction = val
when 'color'
color = val
if !(Array === color) || color.length != 3
raise "color must be Array whose length is three"
end
when 'type'
type = val
when 'width'
width = val
when 'normal'
normal = val
when 'vary'
vary = val
when 'vary_factor'
vary_factor = val
when 'tube_sides'
tube_sides = val
else
raise "option (#{key}) is invalid"
end
}
stream = Vtk::StreamLine.new
stream.SetInput( @grid )
stream.SetStartPosition( *point )
stream.SetMaximumPropagationTime( time )
stream.SetStepLength( ds )
stream.SetIntegrationStepLength( accuracy ) if accuracy
stream.VorticityOn
unless color
stream.SpeedScalarsOn
end
if direction
case direction
when 'forward'
stream.SetIntegrationDirectionToForward
when 'backward'
stream.SetIntegrationDirectionToBackward
when 'both'
stream.SetIntegrationDirectionToIntegrateBothDirections
else
raise "options['direction'] must be 'forward', 'backward', or 'both'"
end
end
if method
case method
when 'rk2'
stream.SetIntegrator( Vtk::RungeKutta2.new )
when 'rk4'
stream.SetIntegrator( Vtk::RungeKutta4.new )
when 'rk45'
stream.SetIntegrator( Vtk::RungeKutta45.new )
else
raise "options['direction'] must be 'rk2', 'rk4', or 'rk45'"
end
end
if type
case type
when 'line'
when 'ribbon'
filter = Vtk::RibbonFilter.new
filter.SetInput( stream.GetOutput )
filter.SetWidth( width ) if width
filter.SetWidthFactor( 5 )
if normal
filter.SetDefaultNormal( *normal )
filter.UseDefaultNormalOn
end
if vary
case vary
when 'off'
filter.VaryWidthOff
when 'scalar'
filter.VaryWidthOn
else
raise "options['vary'] must be 'off' or 'scalar'"
end
filter.SetWidthFactor( vary_factor ) if vary_factor
end
stream = filter
when 'tube'
filter = Vtk::TubeFilter.new
filter.SetInput( stream.GetOutput )
filter.SetRadius( width/2 ) if width
filter.SetNumberOfSides( tube_sides ) if tube_sides
if normal
filter.SetDefaultNormal( *normal )
filter.UseDefaultNormalOn
end
if vary
case vary
when 'off'
filter.SetVaryRadiusToVaryRadiusOff
when 'scalar'
filter.SetVaryRadiusToVaryRadiusByScalar
when 'vector'
filter.SetVaryRadiusToVaryRadiusByVector
else
raise "options['vary'] must be 'off', 'scalar', or 'vector'"
end
filter.SetRadiusFactor( vary_factor ) if vary_factor
end
stream = filter
else
raise "options['type'] must be 'line', 'ribbon', or 'tube'"
end
end
mapper = Vtk::PolyDataMapper.new
mapper.SetInput( stream.GetOutput )
if color
mapper.ScalarVisibilityOff
end
actor = Vtk::Actor.new
actor.SetMapper( mapper )
if color
actor.GetProperty.SetColor( *color )
end
@ren.AddActor( actor )
return nil
end